<template>
  <!--根据tableset 渲染table 样式，绑定info.table下的内容-->
  <div class="celltable" :class="{ printtable: printing }"
    :style="'width:' + tablewidth + 'px;height:' + tableheight + 'px;'" :id="cellprint" unselectable="on">
    <!-- <el-button type="primary" @click="ceshi">主要按钮</el-button> -->
    <table class="designtable" ref="reftable">
      <tr v-for="(tr, i) in tableset.trs" :key="'tr_' + i">
        <template v-for="(td, j) in tr.tds">
          <template v-if="td.tdwidth > 0 && td.tdheight > 0">
            <td v-if="td.rowspan > 0 && td.colspan > 0" :key="'td_' + i + '_' + j" :style="'width:' +
              td.tdwidth +
              'px;height:' +
              td.tdheight +
              'px;border-left-style:' +
              td.bleft +
              ';border-top-style:' +
              td.btop +
              ';border-right-style:' +
              td.bright +
              ';border-bottom-style:' +
              td.bbottom +
              ';background:' +
              td.com.comstyles['background'] +
              ';border-left-width:' +
              td.com.comstyles.borderleft +
              'px;border-top-width:' +
              td.com.comstyles.bordertop +
              'px;border-right-width:' +
              td.com.comstyles.borderright +
              'px;border-bottom-width:' +
              td.com.comstyles.borderbottom +
              'px;border-left-color:' +
              td.com.comstyles.colorleft +
              ';border-top-color:' +
              td.com.comstyles.colortop +
              ';border-right-color:' +
              td.com.comstyles.colorright +
              ';border-bottom-color:' +
              td.com.comstyles.colorbottom +
              ';'
              " :rowspan="td.rowspan" :colspan="td.colspan" class="tdcell" @click="cellclick(i, j, tr, td)"
              @dblclick="runEvent('dblclick', i, j, tr, td)">
              <div v-if="td.com.comattrs.showType != '8'" :style="'width:' +
                td.com.comstyles.width +
                'px;height:' +
                td.com.comstyles.height +
                'px;line-height:' +
                td.com.comstyles.height +
                'px;font-size:' +
                td.com.comstyles['font-size'] +
                'px;font-weight:' +
                td.com.comstyles['font-weight'] +
                ';color:' +
                td.com.comstyles['color'] +
                ';text-align:' +
                td.com.comstyles['text-align'] +
                ';font-family:' +
                td.com.comstyles['font-family'] +
                ';background:' +
                (td.canUpdate && (info.table[td.com.comattrs.tableIdx].record[tr.rindex][td.com.comattrs.fieldName.toUpperCase()] == null) ? '#FFFFFF' : td.com.comstyles['background']) +
                ';border-bottom:' +
                td.com.comstyles.textline +
                ';'
                " :class="{
    'active-cell': activetr == i && activetd == j,
    'error-cell': !td.com.comattrs.right,
  }" class="hiddenText">
                <!-- span用于渲染一些表单中的基本文字内容 -->
                <span v-if="td.com.comattrs.showType == '1'"
                  :style="'margin-left:' + td.com.comstyles.offsetL + 'px;margin-right:' + td.com.comstyles.offsetR + 'px;'">{{
                    td.com.comattrs.showDetail
                  }}</span>
                <!--除了标签 其它控件都要绑定字段和table-->
                <template v-if="td.com.comattrs.tableIdx != null && td.com.comattrs.fieldName != null">
                  <el-tooltip class="item" effect="dark" :content="td.com.comattrs.msg" placement="top-start"
                    :disabled="td.com.comattrs.right">
                    <!-- input框内容渲染 -->
                    <template v-if="td.com.comattrs.showType == '0'">
                      <!--如果是键值对显示，那么就用span显示  如果是readonly 也用span显示, 虚拟字段 就要显示字段内容，不用转义，或者就用输入框输入   span里写事件的话，必须要设定 span 的宽度高度-->
                      <!-- <template v-if="td.com.comattrs.readonly">
                        <dmInput
                           
                          :testInfo="'1-'+i+'_'+j+'_'+td.com.comattrs.fieldName"
                            v-model.trim="info.table[td.com.comattrs.tableIdx].record[tr.rindex][td.com.comattrs.fieldName]"
                            :readonly="true"
                            :disabled="!td.com.comattrs.enable"
                            :formatText="td.com.comattrs.showFormat"
                        ></dmInput>
                
                      </template> -->

                      <!-- 翻译用 -->
                      <!-- showtype !=2 && showdetail != null && select option 字段数大于1即name存在 -->
                      <dmInput v-if="info.table[td.com.comattrs.tableIdx].fields.find((b) => b.fieldName == td.com.comattrs.fieldName.toUpperCase()) &&
                        info.table[td.com.comattrs.tableIdx].select[td.com.comattrs.fieldName.toUpperCase()] &&
                        info.table[td.com.comattrs.tableIdx].select[td.com.comattrs.fieldName.toUpperCase()].option.filter(Boolean).find(
                          (a) => a.ID == info.table[td.com.comattrs.tableIdx].record[tr.rindex][td.com.comattrs.fieldName.toUpperCase()]
                        ) &&
                        Object.keys(
                          info.table[td.com.comattrs.tableIdx].select[td.com.comattrs.fieldName.toUpperCase()] &&
                          info.table[td.com.comattrs.tableIdx].select[td.com.comattrs.fieldName.toUpperCase()].option.find(
                            (a) => a.ID == info.table[td.com.comattrs.tableIdx].record[tr.rindex][td.com.comattrs.fieldName.toUpperCase()]
                          )
                        ).length > 1
                        " v-model.trim="info.table[td.com.comattrs.tableIdx].select[td.com.comattrs.fieldName.toUpperCase()].option.find(
    (a) => a.ID == info.table[td.com.comattrs.tableIdx].record[tr.rindex][td.com.comattrs.fieldName.toUpperCase()]
  ).NAME
    " :formatText="td.com.comattrs.showFormat" @blur="runEvent('inputblur', i, j, tr, td)"
                        @change="runEvent('inputchange', i, j, tr, td)" :disabled="!td.com.comattrs.enable"
                        @focus="runEvent('inputfocus', i, j, tr, td)"></dmInput>
                      <dmInput v-else-if="info.table[td.com.comattrs.tableIdx] &&
                        info.table[td.com.comattrs.tableIdx].record[tr.rindex] && info.table[td.com.comattrs.tableIdx].record[tr.rindex][[td.com.comattrs.fieldName.toUpperCase()]] &&
                        (info.table[td.com.comattrs.tableIdx].record[tr.rindex][td.com.comattrs.fieldName.toUpperCase()].toString().indexOf(',') != -1) && info.table[td.com.comattrs.tableIdx].record[tr.rindex]
                        " v-model.trim="info.table[td.com.comattrs.tableIdx].record[tr.rindex][`${td.com.comattrs.fieldName.toUpperCase()}_NAME`]"
                        :formatText="td.com.comattrs.showFormat" @blur="runEvent('inputblur', i, j, tr, td)"
                        @change="runEvent('inputchange', i, j, tr, td)" :disabled="!td.com.comattrs.enable"
                        @focus="runEvent('inputfocus', i, j, tr, td)"></dmInput>
                      <dmInput v-else
                        v-model.trim="info.table[td.com.comattrs.tableIdx].record[tr.rindex][td.com.comattrs.fieldName.toUpperCase()]"
                        :formatText="td.com.comattrs.showFormat" @blur="runEvent('inputblur', i, j, tr, td)"
                        @change="runEvent('inputchange', i, j, tr, td)" :disabled="td.com.comattrs.readonly"
                        @focus="runEvent('inputfocus', i, j, tr, td)"></dmInput>
                    </template>
                    <el-select v-if="td.com.comattrs.showType == '2'"
                      v-model="info.table[td.com.comattrs.tableIdx].record[tr.rindex][td.com.comattrs.fieldName.toUpperCase()]"
                      :disabled="!td.com.comattrs.enable" clearable filterable allow-create
                      :style="'height:' + td.com.comstyles.height + 'px;'"
                      @change="runEvent('selectchange', i, j, tr, td)"
                      @visible-change="selectvisible($event, i, j, tr, td)">
                      <el-option :style="'width:' + td.com.comstyles.width + 'px;'" v-for="item in td.com.comattrs.option"
                        :key="item.ID" :label="item.NAME" :value="item.ID"> </el-option>
                    </el-select>
                    <span class="businessButtonEdit" v-if="td.com.comattrs.showType == '14'" style="
                                                display: inline-block;
                                                align-items: center;
                                                justify-content: center;
                                                width: calc(100% - 6px);
                                                height: calc(100% - 6px);
                                                margin: 3px;
                                                line-height: normal;
                                                text-align: center;
                                            ">
                      {{ info.table[td.com.comattrs.tableIdx].record[tr.rindex][td.com.comattrs.fieldName.toUpperCase()]
                      }}

                    </span>
                    <!-- 日期时间选择器 -->
                    <el-date-picker v-if="td.com.comattrs.showType == '3'" :editable="false"
                      v-model="info.table[td.com.comattrs.tableIdx].record[tr.rindex][td.com.comattrs.fieldName.toUpperCase()]"
                      :disabled="!td.com.comattrs.enable" :format="dateFormat(td.com.comattrs.showFormat)"
                      value-format="yyyy-MM-dd HH:mm:ss" @change="runEvent('datechange', i, j, tr, td)" type="date">
                    </el-date-picker>
                    <el-date-picker v-if="td.com.comattrs.showType == '4'" :editable="false"
                      v-model="info.table[td.com.comattrs.tableIdx].record[tr.rindex][td.com.comattrs.fieldName.toUpperCase()]"
                      :disabled="!td.com.comattrs.enable" format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss"
                      type="datetime">
                    </el-date-picker>
                    <!-- 在td框内会蹦出多选框，不知道什么用 -->
                    <dmCheckBox v-if="td.com.comattrs.showType == '5'"
                      v-model="info.table[td.com.comattrs.tableIdx].record[tr.rindex][td.com.comattrs.fieldName.toUpperCase()]"
                      :disabled="!td.com.comattrs.enable" @change="checkChange($event, i, j, tr, td)"></dmCheckBox>
                    <!--<el-checkbox v-if="td.com.comattrs.showType=='5'" style="margin-left: 14px;margin-right: 14px;" :label="td.com.comattrs.showDetail" ref="checks"
										 v-model="info.table[td.com.comattrs.tableIdx].record[tr.rindex][td.com.comattrs.fieldName]" :disabled="!td.com.comattrs.enable"></el-checkbox>-->
                    <!-- switch开关，会有一些看不懂的代码，不知道什么意思	 -->
                    <el-switch v-if="td.com.comattrs.showType == '6'"
                      :style="'margin-left:' + td.com.comstyles.offsetL + 'px;margin-right:' + td.com.comstyles.offsetR + 'px;'"
                      :disabled="!td.com.comattrs.enable"
                      v-model="info.table[td.com.comattrs.tableIdx].record[tr.rindex][td.com.comattrs.fieldName.toUpperCase()]"
                      :active-text="swtichName(td.com.comattrs.showDetail, true)"
                      :inactive-text="swtichName(td.com.comattrs.showDetail, false)">
                    </el-switch>
                    <template v-if="td.com.comattrs.showType == '7'">
                      <!--如果是键值对显示，那么就用span显示  如果是readonly 也用span显示, 虚拟字段 就要显示字段内容，不用转义，或者就用输入框输入   span里写事件的话，必须要设定 span 的宽度高度-->
                      <template v-if="td.com.comattrs.readonly">
                        <el-input v-if="td.com.comattrs.showDetail && !td.com.comattrs.virtual"
                          v-model.trim="td.com.comattrs.option" type="textarea" resize="none" ref="area" readonly
                          :disabled="!td.com.comattrs.enable"></el-input>
                        <el-input v-else
                          v-model.trim="info.table[td.com.comattrs.tableIdx].record[tr.rindex][td.com.comattrs.fieldName.toUpperCase()]"
                          type="textarea" resize="none" ref="area" readonly
                          :disabled="!td.com.comattrs.enable"></el-input>
                      </template>
                      <el-input v-else
                        v-model.trim="info.table[td.com.comattrs.tableIdx].record[tr.rindex][td.com.comattrs.fieldName.toUpperCase()]"
                        type="textarea" resize="none" ref="area" @blur="runEvent('inputblur', i, j, tr, td)"
                        @change="runEvent('inputchange', i, j, tr, td)" :disabled="!td.com.comattrs.enable"
                        @focus="runEvent('inputfocus', i, j, tr, td)"></el-input>
                    </template>
                    <!-- 显示添加图片的组件 -->
                    <imgUpload v-if="td.com.comattrs.showType == '9' || td.com.comattrs.showType == '10'"
                      :height="td.com.comstyles.height" :width="td.com.comstyles.width"
                      :pfileList="info.table[td.com.comattrs.tableIdx].record[tr.rindex][td.com.comattrs.fieldName.toUpperCase()]"
                      :disabled="!td.com.comattrs.enable"
                      :plimit="td.com.comattrs.showType == 10 ? 1 : td.com.comattrs.maxVal"
                      :recognition="td.com.comattrs.showType == 10 ? true : false"
                      @fileList="setfile($event, td.com.comattrs.tableIdx, tr.rindex, td.com.comattrs.fieldName.toUpperCase())"
                      @settable="settable"></imgUpload>
                    <!-- 显示添加图片的组件 -->
                    <imgView v-if="td.com.comattrs.showType == '11'" :width="td.com.comstyles.width"
                      :height="td.com.comstyles.height"
                      :pfileList="info.table[td.com.comattrs.tableIdx].record[tr.rindex][td.com.comattrs.fieldName.toUpperCase()]"
                      :disabled="!td.com.comattrs.enable"></imgView>
                    <!-- 显示添加图片的组件 -->
                    <imgSign v-if="td.com.comattrs.showType == '12'" :width="td.com.comstyles.width"
                      :height="td.com.comstyles.height"
                      :pfileList="info.table[td.com.comattrs.tableIdx].record[rindx(td, tr.rindex)][td.com.comattrs.fieldName.toUpperCase()]"
                      :disabled="!td.com.comattrs.enable"></imgSign>
                    <!-- 不知道干嘛用的 -->
                    <dmSelect v-if="td.com.comattrs.showType == '13'" :width="td.com.comstyles.width"
                      :height="td.com.comstyles.height" :columns="td.com.comevents.columns" :sql="td.com.comevents.sql"
                      @setSelect="setSelect($event, i, j, tr, td)" @change="runEvent('inputchange', i, j, tr, td)"
                      @focus="runEvent('inputfocus', i, j, tr, td)"
                      v-model="info.table[td.com.comattrs.tableIdx].record[rindx(td, tr.rindex)][td.com.comattrs.fieldName.toUpperCase()]"
                      :disabled="!td.com.comattrs.enable"></dmSelect>
                  </el-tooltip>
                </template>
              </div>
              <!-- 控制显示一堆二维码 -->
              <template v-else>
                <qrcode v-if="td.com.comattrs.tableIdx != null && td.com.comattrs.fieldName != null"
                  :sid="'q' + pwpId + '_' + pfuncId + '_' + pworkId"
                  :text="info.table[td.com.comattrs.tableIdx].record[tr.rindex][td.com.comattrs.fieldName.toUpperCase()]"
                  :swidth="td.tdwidth - 1" :sheight="td.tdheight - 1">
                  <!--div 里设置了行高，高度，二维码不会居中显示了，所以二维码写到div 外面-->
                </qrcode>
              </template>
            </td>
          </template>
          <!-- 不知道用于控制什么情况下显示的td -->
          <td v-else :key="'td_' + i + '_' + j"
            :style="'width:' + td.tdwidth + 'px;height:' + td.tdheight + 'px;border:none;'"></td>
        </template>
      </tr>
      <!-- v-if="isQrCodeShow" -->
      <div v-show="erweima" class="erweima">
        <qrcode :sid="'q' + pwpId + '_' + pfuncId + '_' + pworkId" :text="`${this.qrCode}`" :swidth="80" :sheight="80" />
      </div>
    </table>

    <organizationTree v-if="show == 'selectUser' || show == 'selectDept'" :checkBoxShow="checkBoxShow" :dialogShow="1"
      :type="type" :propsParam="propsParam" @getCheckedRoles="setValue" @treeCancel="show = null"></organizationTree>
    <!-- 附件管理 -->
    <manage v-if="show == 'selectFile'" :tableName="tableName" :fieldName="fieldName" :isBrowse="isBrowse" :mid="pkValue"
      @updateFileName="setValue" @hide="show = null" :fileType="fileType" :gcId="gcId" :xmId="xmId" :deptId="deptId"
      :fjParam="fjParam"></manage>
    <templatePage v-if="show == 'templateWindow' || show == 'template'" :params="pparam" @confirm="setRecord"
      @cancel="show = null"></templatePage>
    <!-- 表单内容 -->
    <cellView v-if="show == 'cellView'" ref="cellviews" :nodeId="pparam.nodeId" :tworkId="pparam.workId"
      :wpId="pparam.wpId" :businessInfo="businessInfo" :initParam="pparam.initParam" :tdeptId="pparam.deptId"
      :funcCode="pparam.funcCode" @close="setCellView"></cellView>
    <!-- 签名 -->
    <winSign v-if="show == 'winSign'" :fileList="fileList" :isBrowse="isBrowse" @close="show = null" @ok="setSign">
    </winSign>
    <data-tree v-if="show == 'selectType'" :type="pparam.type" :dropMenuShow="1" :param="param" :params="pparam"
      :isMask="true" :dialogTitle="pparam.title" :checkBox="pparam.checkBox" @treeCancel="show = null"
      @getCheckedType="setRecord"></data-tree>
    <!-- 资金科目选择 -->
    <fundAccount-Tree v-if="show == 'selectFunds'" :params="pparam" :dialogShow="true" @cancel="show = null"
      @confirm="setRecord"></fundAccount-Tree>
    <!-- 模块选择 -->
    <menuTree v-if="show == 'selectMenu'" :dialogShow="true" @cancel="show = null" @confirm="setRecord" :type="0"
      :param="{ parentId: 0 }"></menuTree>
    <!-- 角色选择 -->
    <projectDeptTree v-if="show == 'projectDeptTree'" :params="pparam" @cancel="show = null" @confirm="setRecord">
    </projectDeptTree>
    <custom-tree v-if="show == 'customTree'" :checkBoxShow="checkBoxShow" :dialogShow="1" :type="type"
      :propsParam="propsParam" :microId="microId" @getCheckedRoles="setRecord" @treeCancel="show = null"></custom-tree>
    <!-- <div v-if="erweima" class="erweima">
			<qrcode :sid="'123'" :text="'我是二维码'" :swidth="80" :sheight="80" />
		</div> -->
  </div>
</template>

<script>
import CustomTree from '../../business/components/customTree';
import menuTree from '@/system/components/menuTree.vue';
import fundAccountTree from '../../business/components/fundAccountTree.vue';
import dataTree from '../../business/components/commonTree.vue';
import imgUpload from '@/system/components/imgUpload.vue';
import imgView from '@/system/components/imgView.vue';
import imgSign from '@/system/components/imgSign.vue';
import winSign from '@/system/components/winSign.vue';
import dmInput from '@/system/components/dmInput.vue';
import dmSelect from '@/system/components/dmSelect.vue';
import dmCheckBox from '@/system/components/dmCheckBox.vue';
import { deepCopy, strLen, dateFormat } from '@/utils/public';
import Print from '@/utils/printarea.js';
import { wpdetail, wpselect, wpsave, wpgetValue, sqlValue, userDefinedApi, wfSaveUser } from '@/system/api/cellView';
import { validateInt, validateFloat } from '@/utils/validate';
import { losttableset, com } from '../config/cellConfigs';
import { userevent } from '../config/userevent';
import organizationTree from '@/system/components/organizationTree.vue';
import manage from '@/system/components/attachment/manage.vue';
import qrcode from '@/system/components/qrcode.vue';
import QRCode from 'qrcodejs2';
import templatePage from '@/system/pages/customPage/templateWindow.vue';
import projectDeptTree from '@/business/components/projectDeptTree.vue';
//	import ElSwitch from '@/element-ui/packages/switch/src/component.vue'
import { Tooltip } from 'element-ui';
import Vue from 'vue';

//  let sys = require("@/system/api/sys.js");
import { $ajax } from '@/system/api/sys.js'

Vue.use(Tooltip);
//	Vue.use(ElSwitch);
export default {
  name: 'sysCellView',
  components: {
    CustomTree,
    organizationTree,
    qrcode,
    manage,
    templatePage,
    dataTree,
    imgUpload,
    imgView,
    winSign,
    imgSign,
    fundAccountTree,
    dmInput,
    dmSelect,
    dmCheckBox,
    menuTree,
    projectDeptTree,
    $ajax
  },
  props: {
    cellAdd: {
      default: null
    },
    getWorkRepdeptId: {
      default: null,
    },
    pwpId: {
      default: null,
    }, //表单id，打开表单用  wpId  funcId 至少一个
    pfuncId: {
      default: null,
    }, //菜单id，打开表单用，
    pnodeId: {
      default: null,
    }, //控制表单只读和编辑  0  只读  1编辑
    pworkId: {
      default: null,
    }, //表单数据id
    pinstNodeId: {
      default: null,
    }, //实例节点id
    pdeptId: {
      default: null,
    }, //传入部门id
    initParam: {
      default: null,
    },
    pbusinessInfo: {
      default: null,
    },
    pwpInstNodeId: {
      default: null,
    },
    funcCode: {
      defualt: null,
    },
    acceptTime: {
      defualt: null,
    },
    wfVar: [],
  },
  data() {
    // 测试的表单id  实例id  144,163   0 未上报，1 流转，2 完成，-1 报废
    return {
      isQrCodeShow: false,
      qrCode: null,
      erweima: false,
      microId: null,
      canSave: true,
      jobcode: null,
      param: {
        pid: 0,
      },
      tablewidth: 0,
      tableheight: 0,
      dheight: 0,
      dwidth: 0,
      inittd: {
        rowspan: 1,
        colspan: 1,
        tdwidth: 121,
        tdheight: 32,
        bleft: 'solid',
        btop: 'solid',
        bright: 'solid',
        bbottom: 'solid',
        com: null,
      },
      tablesetp: null,
      tableRecord: {
        record: [{}],
      },
      activetr: -1,
      activetd: -1,
      flush: 0,
      instNodeId: null,
      userEvents: null, //用户事件
      show: null,
      //				部门角色人员变量
      type: 2,
      checkBoxShow: 1,
      propsParam: null,
      //				附件上传变量
      tableName: null, //表名
      fieldName: null, //字段名
      isBrowse: false, //是否浏览
      pkValue: null, //主键值
      fileType: null, //文件类型
      gcId: null, //附件用
      xmId: null, //附件用
      fjParam: null, //附件新的动态参数
      mainTableName: null, //附件用  附件双击的表名
      tableset: [], //sysCellView 会设置的
      info: {
        //sysCellView 会设置的  ，可以修改里面的内容
        wpId: null,
        notice: null,
        content: null,
        table: [
          {
            record: [{}],
          },
        ],
      },
      workId: null, //表单实列id	  打开表单用的
      nodeCode: null, // sysCellView 会设置的
      wfClassId: null, // sysCellView 会设置的
      isStartNode: null, //是否首节点  sysCellView 会设置的
      pparam: {}, //templateWindow 参数
      fvar: [], //fvar  流程自定义参数
      businessInfo: null, //系统参数，有工程id  等
      wpInstNodeId: null, //计划节点实例ID
      addrow: false, //可不可以新增行，删除行， 默认不可以
      cellprint: null,
      out: null, //按钮弹窗 输出请求
      comParam: null, //按钮弹窗后端请求参数
      fileList: null, //签名url
      printing: false, //是否打印中,
      funcId: null,
      repId: null,
      button: [], //打开表单的自定义按钮
      notNullNum: false, // 发送流程判断用
    };
  },
  filters: {
    formatText: function (v, td) {
      //console.log(v);
      //console.log(td.com.comattrs.showFormat);
      return v;
    },
  },
  computed: {
    rindx: function () {
      return function (td, trindex) {
        if (td.com.comattrs.tableIdx == 0) {
          return 0;
        } else {
          return trindex;
        }
      };
    },
    dateFormat: function () {
      return function (showFormat) {
        let formatstr = 'yyyy-MM-dd';
        if (showFormat == 'yyyy 年 MM 月 dd 日') {
          formatstr = showFormat;
        }
        return formatstr;
      };
    },
    swtichName: function () {
      return function (label, flag) {
        let res = '';
        if (label) {
          let arr = label.replace(/，/gi, ',').split(',');
          if (flag) {
            res = arr[1];
          } else {
            res = arr[0];
          }
        }
        return res;
      };
    },
    setFieldText1: function () {
      //此方法暂时不用
      return function (td, tr, i, j) {
        let sql = td.com.comattrs.showDetail;
        let val = this.info.table[td.com.comattrs.tableIdx].record[tr.rindex][td.com.comattrs.fieldName];
        let res = '';
        if (sql.toLowerCase().indexOf('sql:') != -1) {
          //如果是sql  就去sql查找
          let param = {
            tableIdx: td.com.comattrs.tableIdx,
            rindex: tr.rindex,
            fieldName: td.com.comattrs.fieldName,
          };
        } else {
          //如果是写死的 就
          if (val) {
            let arr = sql.replace(/，/gi, ',').split(','); // 1:aaa,2:ccc,3:ddd  或者 1 aaa,2 bbb,3 ddd  这种
            arr.forEach((item, index) => {
              //切好的数组遍历 查找是不是包含value值
              if (item.indexOf(val + ':') > -1 || item.indexOf(val + '-') > -1 || item.indexOf(val + ' ') > -1) {
                let len = val.toString().length;
                res = item.substring(len + 1);
              }
            });
          }
        }
        return res;
      };
    },
    setOption1: function () {
      //此方法暂时不用
      return function (td, tr, i, j, flush) {
        let sql = td.com.comattrs.showDetail;
        let optionarr = [];
        let tableIndex = null;
        let field = null;
        let paramArr = [];
        if (sql.indexOf('sql:') != -1 || sql.indexOf('SQL:') != -1) {
          //如果是sql  就去sql查找
          regex = new RegExp('(?<=[)(.+?)(?=])'); //用正则表达式 把 sql中的 参数取出来
          let params = sql.match(regex);
          params.forEach((item, index) => {
            let itemArr = item.split(':');
            //下拉框  切割 后  组装值
            tableIndex = itemArr[0];
            let rindex = null; //获取行索引
            if (tableIndex == 0) {
              rindex = 0;
            } else {
              rindex = tr.rindex;
            }
            field = itemArr[itemArr.length - 1]; //切割字段
            let obj = {}; //组装参数
            this.$set(obj, tableIndex + ':' + field, this.info.table[tableIndex].record[rindex][field]);
            paramArr.push(obj);
          });
          //		    			{wpId:this.wpId,param:paramArr};
        } else {
          let arr = sql.replace(/，/gi, ',').split(',');
          for (let i = 0; i < arr.length; i++) {
            let obj;
            if (arr[i].indexOf(':') > -1) {
              // 值和name 用冒号分开
              let items = arr[i].split(':');
              obj = {
                value: items[0],
                label: items[1],
              };
            } else if (arr[i].indexOf('-') > -1) {
              // 值和name 用-分开
              let items = arr[i].split('-');
              obj = {
                value: items[0],
                label: items[1],
              };
            } else {
              let items = arr[i].split(' '); // 值和name 用空格分开
              if (items.length > 1) {
                obj = {
                  value: items[0],
                  label: items[1],
                };
              } else {
                //如果没空格说明没值 那么就用索引代替
                obj = {
                  value: i,
                  label: arr[i],
                };
              }
            }
            optionarr.push(obj);
          }
        }

        return optionarr;
      };
    }
  },
  created() {
    //初始化 变量
    if (this.pworkId) {
      this.workId = this.pworkId;
    }
    // console.log(this.pdeptId)
    this.deptId = this.getWorkRepdeptId || this.pdeptId; //表单打开则取表单的填报部门
    this.businessInfo = this.pbusinessInfo;
    this.wpInstNodeId = this.pwpInstNodeId;
    this.cellprint = 'p' + this.pwpId + '_' + this.pfuncId + '_' + this.pworkId;
  },
  mounted() {
    console.log('!!!!!!!!!!!!!!');
    this.tableset = [];
  },
  methods: {
    // (?<=\[)(\d+:){1,2}\w+(?=\])  这个正则 (?<=\[) 取中括号后， regex = new RegExp('(?<=\[)(\d+:){1,2}\w+(?=\])');let params = str.match(regex);
    setcomsize() {
      this.tableset.trs.forEach((tr, trindex) => {
        tr.tds.forEach((td, tdindex) => {
          if (td.com != null) {
            let tdwidth = 0;
            let tdheight = 0;
            let tw = false;
            let th = false;
            for (let i = trindex; i < td.rowspan + trindex; i++) {
              if (tdheight > 0) {
                th = true;
                tdheight = tdheight + parseFloat(this.tableset.trs[i].tds[tdindex].com.comstyles.bordertop);
              }
              tdheight = tdheight + parseFloat(this.tableset.trs[i].tds[tdindex].tdheight);
              for (let j = tdindex; j < td.colspan + tdindex; j++) {
                if (i == trindex) {
                  tdwidth = tdwidth + parseFloat(this.tableset.trs[i].tds[j].tdwidth);
                }
              }
            }

            if (td.com.comstyles.width != tdwidth || td.com.comstyles.height != tdheight) {
              this.$set(td.com.comstyles, 'width', tdwidth - 1); //宽度必须减去线的宽度
              this.$set(td.com.comstyles, 'height', tdheight); //height 不用减 ，因为底部的td底部的线属于下一行td的top，不属于当前td的
            }
          }
        });
      });
      //				this.tableset.trs.forEach((tr, trindex) => {
      //					tr.tds.forEach((td, tdindex) => {
      //						if (td.com != null) {
      //
      //							let tdwidth = 0;
      //							let tdheight = 0;
      //							for (let i = trindex; i < td.rowspan + trindex; i++) {
      //								tdheight = tdheight + this.tableset.trs[i].tds[tdindex].tdheight;
      //								for (let j = tdindex; j < td.colspan + tdindex; j++) {
      //
      //									if (i == trindex) {
      //										tdwidth = tdwidth + this.tableset.trs[i].tds[j].tdwidth;
      //									}
      //								}
      //							}
      //							if (td.com.comstyles.width != tdwidth || td.com.comstyles.height != tdheight) {
      //								this.$set(td.com.comstyles, 'width', tdwidth - 1);
      //								this.$set(td.com.comstyles, 'height', tdheight - 1);
      //							}
      //
      //						}
      //					});
      //				});
    },
    settablesize() {
      //计算table的尺寸，配置table外的div的尺寸 计算表格 的高度 宽度
      let th = 0;
      let tw = 0;
      let $trs = this.tableset.trs;
      //console.log($trs.length)
      for (let i = 0; i < $trs.length; i++) {
        if (i == 0) {
          let $tds = $trs[i].tds;
          for (let j = 0; j < $tds.length; j++) {
            tw = parseFloat($tds[j].tdwidth) + tw; //border = 1
          }
        }
        th = parseFloat($trs[i].tds[0].tdheight) + th; //border = 1
      }
      this.tablewidth = tw;
      this.dwidth = this.tablewidth + 40;
      this.tableheight = th;
      let theight = 0;
      if (this.tableheight > document.documentElement.clientHeight - 156 - 90) {
        theight = document.documentElement.clientHeight - 90; //40 是 弹窗的header 按钮区56  20  离底部 上下margin16
      } else {
        theight = this.tableheight + 156;
      }

      //console.log(theight)
      this.$emit('size', {
        width: this.dwidth,
        height: theight,
      });
      //  for (let tr of this.tableset.trs) {
      //     console.log(tr)
      //       for (let td of tr.tds) {
      //           // console.log(td)
      //         // console.log(this.info.table[td.com.comattrs.tableIdx].record[tr.rindex][td.com.comattrs.fieldName])
      //   //       console.log(this.info.table[td.com.comattrs.tableIdx].record[tr.rindex][td.com.comattrs.fieldName])
      //       }
      //   }
    },
    getRowSpanTd(i) {
      //如果当前单元格是子表的，又是被合并的，说明整个子表该单元格都是合并的，那么要找到这个跨行的单元格重新设置它的rowspan

      let spantds = [];
      let rowspans = 0;
      this.tablesetp.trs[i].tds.forEach((td, tdindex) => {
        //遍历子表的每个单元格，判断是否存在合并单元格
        let spantd = null;
        if (td.rowspan == 0) {
          //rwospan 为0  往上查找可能存在 跨行的单元格
          //如果当前单元格是被合并的，那么往上查找被合并的行单元格并记录，找不到就不记录
          for (let k = i; k >= 0; k--) {
            let rtd = this.tablesetp.trs[k].tds[tdindex];
            if (rtd.rowspan == 0) {
              rowspans = rowspans + 1;
            } else {
              //当 rtd.rowspan 为1 或者大于1 就跳出循环   如果rowspan 为1  那么 tr[i].td[j]的单元格rowspan 可能被 其它的列的单元格合并了
              if (rtd.rowspan > rowspans) {
                spantd = rtd;
              }
              break;
            }
          }

          if (spantd != null) {
            spantds.push(spantd);
          }
        }
      });
      //				//console.log(spantds);
      return spantds;
    },
    // setinputEnable(td, rin) {

    // },
    // 表单禁用
    setfieldEnable(td, rindex) {
      //根据nodeCode   设置表单 单元格是否可以编辑  单元格可用不可用	放在tableset中
      if (this.nodeCode == '999999') {
        td.com.comattrs.enable = true;
      } else if (this.nodeCode == '0') {
        td.com.comattrs.enable = false;
      } else {
        if (td.com.comattrs.wfNode) {
          let tenable = false;
          td.com.comattrs.wfNode.forEach((code) => {
            if (code == this.nodeCode) {
              tenable = true;
            }
          });
          td.com.comattrs.enable = tenable;
        } else {
          if (td.com.comattrs.tableIdx) {
            if (this.info.table[td.com.comattrs.tableIdx].tableName == 'T_USER_MSIGN') {
              //如果是签名表 那么就设置不可用
              td.com.comattrs.enable = false;
            }
          }
        }
        //无流程
        if (this.wfClassId == null) {
          td.com.comattrs.enable = true;
        }
      }
    },
    setUserSignEnable(td, rindex) {
      //放在初始化下拉单中
      //加签名表特殊判断  根据用户  节点id  判断
      if (td.com) {
        if (td.com.comattrs.tableIdx) {
          // console.log(this.info.table, td.com.comattrs.tableIdx);
          if (this.info.table[td.com.comattrs.tableIdx].tableName == 'T_USER_MSIGN') {
            //如果是签名表

            if (this.pinstNodeId == null) {
              //如果流程节点是空的话，表单签名不可用
              td.com.comattrs.enable = false;
            } else {
              let wf_node_id = this.info.table[td.com.comattrs.tableIdx].record[rindex]['wf_node_id'];
              let owner = this.info.table[td.com.comattrs.tableIdx].record[rindex]['owner'];
              let user = this.$store.state.user.info;
              if (wf_node_id) {
                //根据当前td的记录索引 查 wf_node_id

                if (wf_node_id == this.pinstNodeId && user.id == owner) {
                  //如果签名的wf_node_id   和 td的 节点id  一致，说明当前签名可用
                  td.com.comattrs.enable = true;
                } else {
                  td.com.comattrs.enable = false;
                }
              } else {
                td.com.comattrs.enable = false;
              }
            }
          }
        }
      }
    },
    canAddRow(i) {
      let canAdd = false;
      if (this.nodeCode == '999999') {
        canAdd = true;
      } else if (this.nodeCode == '0') {
        canAdd = false;
      } else {
        // console.log(this.tablesetp,i)
        // console.log(this.tableset)
        let tr = this.tablesetp.trs[Math.min(i, this.tablesetp.trs.length - 1)];
        let firstwfNode = null;
        for (let j = 0; j < tr.tds.length; j++) {
          let td = tr.tds[j];
          if (td.com && td.com.comattrs.tableIdx != null) {
            if (td.com.comattrs.wfNode) {
              firstwfNode = td.com.comattrs.wfNode;
              break; //找到第一个配置了wfNode 的单元格
            }
          }
        }
        if (firstwfNode) {
          //遍历firstwfNode，如果当前节点code 和 单元格配置的节点一样，第一个单元格并可用，那么就假设可以增加行
          firstwfNode.forEach((code) => {
            if (code == this.nodeCode) {
              canAdd = true;
            }
          });
        }
      }
      return canAdd;
    },
    setTableSet() {
      //给子表增加记录
      this.tableset = {}; //清空tableset ，然后根据  记录 增加 行数
      let trs = [];
      let rows = this.tablesetp.trs.length; //tablesetp
      //console.log(rows)
      for (let i = 0; i < rows; i++) {
        //遍历记录，主表是第一个info.table[0], 接下去的是子表，根据子表记录数，增加tableset中子表的trs

        //console.log(i)
        let tr = this.tablesetp.trs[i]; //取 tablesetp 每一行记录
        this.$set(tr, 'rindex', 0); //rindex  记录数
        trs.push(tr);
        let spantds = []; //如果存在行合并的单元格
        if (this.tablesetp.trs[i].tds[0].com != null) {
          //如果td存在com，那么根据com 的tableIndex 判断是否是子表

          let tbindex;
          let haseSub = 0;
          let userSign = false;
          this.tablesetp.trs[i].tds.forEach((td, tdindex) => {
            //遍历 tableset 每列 顺便初始化一些下拉信息
            if (td.com && td.com.comattrs.tableIdx != null) {
              //增加表索引不为null，说明配置了字段
              //								if(td.com.comattrs.tableIdx){//新增行  重新判断
              //									haseSub = haseSub + td.com.comattrs.tableIdx;
              //									if(td.com.comattrs.tableIdx>0){
              //										tbindex = td.com.comattrs.tableIdx;
              //									}
              //								}
              if (td.com.comattrs.tableIdx && td.com.comstyles.addrow) {
                //索引>0  并且 表单设置了可以新增
                tbindex = td.com.comattrs.tableIdx;
                haseSub = 1;
                this.addrow = this.canAddRow(i);
                this.$emit('setAddbtn', this.addrow);
              }
              if (td.com.comattrs.tableIdx) {
                // console.log(this.info.table, td.com.comattrs.tableIdx);
                //这里的是子表
                if (this.info.table[td.com.comattrs.tableIdx].tableName == 'T_USER_MSIGN') {
                  tbindex = td.com.comattrs.tableIdx;
                  userSign = true; //用户签名特别处理
                }
                if (!td.com.comstyles.addrow && this.info.table[td.com.comattrs.tableIdx].tableName != 'T_USER_MSIGN') {
                  //当前表是子表，也不是签名表，但不可以增加多行 ，那么就按表单设定行数初始化  tr的rindex
                  if (this.info.table[td.com.comattrs.tableIdx].rowNum) {
                    let bftd = this.tablesetp.trs[i - 1].tds[tdindex];
                    if (bftd.com && bftd.com.comattrs.tableIdx == td.com.comattrs.tableIdx && bftd.com.comattrs.fieldName == td.com.comattrs.fieldName) {
                      //如果和上一行的td的表索引，字段都相同，那么当前行rindex 要加加
                      let $index = this.tablesetp.trs[i - 1].rindex + 1;
                      this.$set(tr, 'rindex', $index);
                      if (this.info.table[td.com.comattrs.tableIdx].record[$index] == null || this.info.table[td.com.comattrs.tableIdx].record[$index] == undefined) {
                        //如果当前没记录要加空对象要不然会报错
                        this.info.table[td.com.comattrs.tableIdx].record.push({});
                      }
                    }
                  } else {
                    // setTableSet 还有一处要改
                    if (this.info.table[td.com.comattrs.tableIdx].record.length > 1) {
                      tbindex = td.com.comattrs.tableIdx;
                      haseSub = 1;
                    }
                  }
                }
              }

              this.setfieldEnable(td, tr.rindex);
              // 添加的渲染表单根据节点高亮显示
              // let aaa = this.info.table.map(item => item.fields.filter(item => item.fieldName === td.com.comattrs.fieldName))
              // console.log('aaaaaaaaaaa',aaa);
              let canUpdates = this.info.table[0].fields.filter(item => item.fieldName === td.com.comattrs.fieldName)
              if (canUpdates.length !== 0) {
                //   console.log('qqqqqqqqqq',canUpdates[0].canUpdate)
                this.$set(td, 'canUpdate', canUpdates[0].canUpdate)
              }
              // let canUpdates1 = this.info.table[1].fields.filter(item => item.fieldName === td.com.comattrs.fieldName)
              // if(canUpdates1.length !==0){
              //   this.$set(td,'canUpdate', canUpdates1[0].canUpdate)
              // }
              // let canUpdates2 = this.info.table[2].fields.filter(item => item.fieldName === td.com.comattrs.fieldName)
              // if(canUpdates2.length !==0){
              //   this.$set(td,'canUpdate', canUpdates2[0].canUpdate)
              // }
            }
            // this.$set(td,'canUpdate', this.table[0].fields)
          });

          if (haseSub > 0 || userSign) {
            //如果是子表

            //判断子表是否存在一条记录
            //							spantds = this.getRowSpanTd(i);
            if (this.info.table.length == 1) {
              //只有主表记录
              let trecord = deepCopy(this.tableRecord);
              this.info.table.push(trecord);
            } else {
              let nums = this.info.table[tbindex].record.length;
              if (nums == 0) {
                //如果配了子表，但是info没记录，这个时候渲染的子表取不到数组的字段，绑定的字段会报错，给他赋个空对象
                let obj = {};
                this.info.table[tbindex].record.push(obj);
              }
              if (nums == 1) {
                //如果记录是一条那么不用操作
              }
              if (nums > 1) {
                //如果子表记录大于1
                for (let j = 1; j < nums; j++) {
                  let copytr = deepCopy(tr);
                  this.$set(copytr, 'rindex', j);
                  trs.push(copytr); //增加 表单行数  如果是新增一行  那么this.info.table[tbindex].record.push({}) 要插入一条空记录
                }
                spantds.forEach((item, index) => {
                  item.rowspan = item.rowspan + nums - 1;
                });
              }
            }
          }
        }

      }
      // console.log(this.tableset);
      this.$set(this.tableset, 'trs', trs);
      this.$set(this.tableset, 'initJs', this.tablesetp.initJs); //设置运行脚本
      this.$set(this.tableset, 'afterSaveJs', this.tablesetp.afterSaveJs); //设置保存后脚本
      this.$set(this.tableset, 'beforeSendJs', this.tablesetp.beforeSendJs); //设置保存后脚本
      console.log('this.tableset', this.tableset)
      this.userEvents = new userevent(this); //创建 管理用户事件的类
      this.settablesize();
      //				this.setcomsize();
      this.initOption();
      this.calcAll();
    },
    changeworkid() {
      this.$emit("changeworkid", this.workId)
    },
    wpdetail() {
      //funcId wpId workId param nodeCode   根据wpid 获取详情  打开表单 	查询数据	取数据
      return new Promise((resolve) => {
        // console.log(this.pwpId, this.pfuncId , this.funcCode)
        if (this.pwpId || this.pfuncId || this.funcCode) {
          // console.log()
          //wpId  表单id 设置 workId  实列id
          let params = {
            repId: this.pwpId,
            funcId: this.pfuncId,
            nodeId: this.pnodeId,
            workId: this.pworkId,
            param: this.businessInfo,
            instNodeId: this.pinstNodeId,
            wpInstNodeId: this.wpInstNodeId,
            deptId: this.deptId,
            userId: this.$store.state.user.info.id,
            funcCode: this.funcCode
          };
          if (this.cellAdd) { // 清缓存
            params.param = {}
          }
          console.log(params);
          wpdetail(params).then((res) => {
            if (res.success) {
              console.log('请求当前月计划数据', res.info);
              this.info = res.info;
              this.microId = res.info.microId
              if (res.info.isQrCodeShow) {
                this.isQrCodeShow = res.info.isQrCodeShow
                this.qrCode = res.info.qrCode
              }
              // if(this.cellAdd == 1){
              //    this.info.table = this.$store.state.addInfo.newInfo
              //    this.info.table[0].record[0].MONTH_JOB_CODE = ''
              // }
              // if(res.info.funcName == '危险点及措施'){
              //   this.microId = res.info.microId
              // }
              // if(this.info.table[0].record[0]){
              //   this.info.table[0].record[0].BELONG_SEC_ORG_ID = parseInt(this.info.table[0].record[0].BELONG_SEC_ORG_ID)
              // }
              // if(this.info.table[0].record[0] && this.info.table[0].record[0].BELONG_SEC_ORG_ID){
              // 	this.info.table[0].record[0].BELONG_SEC_ORG_ID = parseInt(this.info.table[0].record[0].BELONG_SEC_ORG_ID)
              // }
              // let infoName = 
              // this.info.table.map(item1 => {
              //   return Array.isArray(item1.select.option)
              // })
              //   console.log('option问题所在',infoName);
              if (res.info.content == null) {
                this.tablesetp = losttableset;
              } else {
                console.log(JSON.parse(res.info.content));
                let temptableset = this.addComAttr(JSON.parse(res.info.content));
                this.tablesetp = temptableset; //临时的tableset，真实的tableset要根据数据的行数来设置单元格
              }
              console.log("info.content", this.tablesetp);
              // if (res.info.button) {
              //   this.button = res.info.button;
              // }
              res.info.table.forEach(($table, index) => {
                //初始化一个空对象  要不然渲染的时候会报错
                if ($table.record.length == 0) {
                  $table.record.push({}); //
                } else {
                  // //可能存在定义大写字段，全部转换为小写
                  // for (let idx = 0; idx < $table.record.length; idx++) {
                  //   let newOneRecord = {};
                  //   let oneRecord = $table.record[idx];
                  //   for (let key in oneRecord) {
                  //     newOneRecord[key.toLowerCase()] = oneRecord[key];
                  //   }
                  //   $table.record[idx] = newOneRecord;
                  // }
                }
              });
              console.log("this:", this);
              this.info.table = res.info.table;
              console.log("this.info.table:", this.info.table);
              // if(this.cellAdd == 2){
              //    this.info.table[0].record[0] = this.$store.state.addInfo.newInfo[0].record[0]
              //    this.info.table[1].record[0] = this.$store.state.addInfo.newInfo[1].record[0]
              //    this.info.table[2].record[0] = this.$store.state.addInfo.newInfo[2].record[0]
              // //    this.info.table[0].select = this.$store.state.addInfo.newInfo[0].select
              // //    this.info.table[1].select = this.$store.state.addInfo.newInfo[1].select
              // //    this.info.table[2].select = this.$store.state.addInfo.newInfo[2].select
              //    this.info.table[0].record[0].MONTH_JOB_CODE = ''
              //    this.info.table[0].record[0].MONTH_PLAN_ID = ''
              //    this.info.table[0].record[0].BELONG_ORG_ID = res.info.table[0].record[0].BELONG_ORG_ID;
              //    this.info.table[0].select.BELONG_ORG_ID = res.info.table[0].select.BELONG_ORG_ID;
              // }
              // console.log('没有ID和name',this.info.table);
              // 计划作业编码信息
              // this.jobcode=this.info.table[0].record[0].MONTH_JOB_CODE
              if (this.workId == null || this.workId == '') {
                //如果新增
                if (this.deptId == null) {
                  //部门id 在业务模块或者 模块查询新增 没有传入 部门id
                  this.deptId = this.$store.state.user.info.deptId; //首节点部门特殊特殊处理
                }
                this.$set(this.info.table[0].record[0], 'fill_dept_id', this.deptId); //新增的时候没有部门id，需要设置进去，很多弹窗要根据部门过滤
              }

              if (this.jhId == null || this.jhId == 0 || this.jhId == '') {
                //wpInstNodeId  wpInstNodeId
                this.jhId = res.info.wpInstNodeId;
                // this.wpInstNodeId = res.info.wpInstNodeId;
                console.log("这是计划id：" + this.jhId);
              }

              if (this.nodeCode == null) {
                //如果 传进来的nodeCode  为null  那么取  表单中的nodeCode
                this.nodeCode = res.info.nodeCode;
              }
              this.isStartNode = res.info.isStartNode;

              this.wfClassId = res.info.wfClassId;

              this.repId = res.info.repId;
              this.funcId = res.info.funcId;
              //获取流程图首节点
              this.info.wpId = res.info.wpId; //保存表单id 保存到父组件的info.wpId 中

              this.setTableSet(); //根据数据设置tableset,tableset从这获取数据

              if (this.workId && this.deptId == null) {
                //如果 有主键了  并且this.deptId为null  那么取表单的部门
                this.deptId = this.getWorkRepdeptId;
              }

              let obj = {
                wfClassId: this.wfClassId,
                isStartNode: this.isStartNode,
                jhId: this.jhId,
                workId: this.workId,
                // dataTable: res.info.table[0].tableName,
                workTable: res.info.table[0].tableName,
                fwpid: this.info.wpId,
                deptId: this.deptId,
                funcName: res.info.funcName,
                btns: res.info.button, //按钮  上传倒 cellView 并渲染成 按钮,
                wfState: res.info.wfState,
              };
              let getFieldName = []
              let tableIndex = null
              for (let tbIdx = 0; tbIdx < this.info.table.length; tbIdx++) {// 找几个table
                if (this.info.table[tbIdx].record) {
                  for (let reIdx = 0; reIdx < this.info.table[tbIdx].record.length; reIdx++) {// 找几个record
                    if (this.info.table[tbIdx] && this.info.table[tbIdx].record && this.info.table[tbIdx].record[reIdx]) {
                      // let a = Object.keys(this.info.table[tbIdx].record[reIdx])
                      for (let w = 0; w < Object.keys(this.info.table[tbIdx].record[reIdx]).length; w++) {
                        if (this.info.table[tbIdx].record[reIdx][Object.keys(this.info.table[tbIdx].record[reIdx])[w]]
                          &&
                          typeof (this.info.table[tbIdx].record[reIdx][Object.keys(this.info.table[tbIdx].record[reIdx])[w]]) === 'string'
                          &&
                          this.info.table[tbIdx].record[reIdx][Object.keys(this.info.table[tbIdx].record[reIdx])[w]].indexOf(',') != -1) {
                          getFieldName.push(Object.keys(this.info.table[tbIdx].record[reIdx])[w])
                          // getFieldName = Object.keys(this.info.table[tbIdx].record[reIdx])[w]
                          tableIndex = tbIdx
                        }
                      }
                    }
                  }
                }
                // if(this.info.table[tbIdx] && this.info.table[tbIdx].record && this.info.table[tbIdx].record[0]){
                // 	for(let w=0;w<Object.keys(this.info.table[1].record[0]).length;w++){
                // 		if(this.info.table[1].record[0][Object.keys(this.info.table[1].record[0])[w]].indexOf(',') !=-1){
                // 			getFieldName = Object.keys(this.info.table[1].record[0])[w]
                // 		}
                // 	}
                // 	// Object.keys(this.info.table[1].record[0])
                // }
              }
              // if(this.info.table[1] && this.info.table[1].record && this.info.table[1].record[0]){
              // 	for(let w=0;w<Object.keys(this.info.table[1].record[0]).length;w++){
              // 		if(this.info.table[1].record[0][Object.keys(this.info.table[1].record[0])[w]].indexOf(',') !=-1){
              // 			getFieldName = Object.keys(this.info.table[1].record[0])[w]
              // 		}
              // 	}
              // 	// Object.keys(this.info.table[1].record[0])
              // }
              // getFieldName = this.info.table[1].fields.find(item => {
              //   return  item.selectType == 1
              // }).fieldName



              console.log(getFieldName);
              console.log(tableIndex);
              if (getFieldName) { // 安全培训带回人员有问题，看上面和下面都需要更改，如果是存在多条多个人员怎么去判断？？
                for (let n = 0; n < getFieldName.length; n++) {
                  if (this.info.table[tableIndex] && this.info.table[tableIndex].record) { // 多实施人员
                    for (let i = 0; i < this.info.table[tableIndex].record.length; i++) {
                      //   console.log('成功成功',this.info.table[1].record[i].B_SSRY_B.indexOf(',') !=-1)
                      console.log('看看kank', this.info.table[tableIndex].record[i]);
                      if (this.info.table[tableIndex].record[i][getFieldName[n]] && this.info.table[tableIndex].record[i][getFieldName[n]].indexOf(',') != -1) {
                        console.log(123);
                        //  存在多个人员
                        if (!this.info.table[tableIndex].select[getFieldName[n]][`${getFieldName}_NAME`]) {
                          // 没有新字段
                          let name = this.info.table[tableIndex].record[i][getFieldName[n]].split(',')
                          console.log('测试', name);
                          let filterName = []
                          for (let j = 0; j < name.length; j++) {
                            let options = this.info.table[tableIndex].select[getFieldName[n]].option
                            console.log('成功成功', options);
                            let filterItem = options.filter(a => a.ID == name[j])
                            console.log(filterItem);
                            if (filterItem.length > 0) {
                              filterName.push(filterItem[0].NAME)
                            }
                          }
                          console.log(filterName.toString(), `${getFieldName[n]}_NAME`);
                          this.$set(this.info.table[tableIndex].record[i], `${getFieldName[n]}_NAME`, filterName.toString())
                        } else {
                          // 有新字段
                        }

                      } else {
                        if (this.info.table[tableIndex].record[i].B_SSRY_B_NAME) {
                          // this.$delete(this.info.table[1].record[i],'B_SSRY_B_NAME')
                        }
                      }
                    }
                  }
                }

                //   if(this.info.table[tableIndex] && this.info.table[tableIndex].record){ // 多实施人员
                //   for(let i=0;i<this.info.table[tableIndex].record.length;i++){
                // 	//   console.log('成功成功',this.info.table[1].record[i].B_SSRY_B.indexOf(',') !=-1)
                // 	console.log('看看kank',this.info.table[tableIndex].record[i]);
                // 	if(this.info.table[tableIndex].record[i][getFieldName[n]] &&this.info.table[tableIndex].record[i][getFieldName[n]].indexOf(',') !=-1){
                // 	  //  存在多个人员
                // 	  if(!this.info.table[tableIndex].record[i].B_SSRY_B_NAME){
                // 		// 没有新字段
                // 		let name = this.info.table[tableIndex].record[i][getFieldName[n]].split(',')
                //            console.log('测试',name);
                // 	    let filterName = []
                // 	    for(let j=0;j<name.length;j++){
                // 		  let options = this.info.table[tableIndex].select[getFieldName[n]].option
                // 		  console.log('成功成功',options);
                // 		  let filterItem = options.filter(a => a.ID == name[j])
                // 		  console.log(filterItem);
                // 		  if(filterItem.length>0){
                // 		    filterName.push(filterItem[0].NAME)
                // 		  }
                // 	    }
                // 	    console.log(filterName.toString());
                // 	    this.$set(this.info.table[tableIndex].record[i],'B_SSRY_B_NAME',filterName.toString())
                // 	  }else{
                // 		// 有新字段
                // 	  }

                // 	}else{
                // 	  if(this.info.table[tableIndex].record[i].B_SSRY_B_NAME){
                // 		// this.$delete(this.info.table[1].record[i],'B_SSRY_B_NAME')
                // 	  }
                // 	}
                //   }
                // }
              }

              resolve(obj); //返回 流程类id，是否首节点，计划id，表单实例id
            } else {
              this.message(res.msg, 3);
              this.tablesetp = losttableset;
              this.setTableSet(); //根据数据设置tableset
              resolve(null);
            }
            console.log(this.tableset.trs[0].tds[0].com.comstyles.height);
            if (this.isQrCodeShow && this.tableset.trs[0].tds[0].com.comstyles.height < 100) {
              this.tableset.trs[0].tds[0].com.comstyles.height = 100
            }
          });

          // info.table[td.com.comattrs.tableIdx].record[
          //                         (td, tr.rindex)
          //                       ][td.com.comattrs.fieldName]
          // info.table[td.com.comattrs.tableIdx].record[tr.rindex][td.com.comattrs.fieldName]
        } else {
          resolve(null);
        }
      });
    },
    // 暂时每调用的方法
    addRowBytable(tableIndex, num) {
      let hasadd = 0;
      this.tableset = {}; //清空tableset ，然后根据  记录 增加 行数
      let trs = [];
      let rows = this.tablesetp.trs.length; //tablesetp

      for (let i = 0; i < rows; i++) {
        //遍历记录，主表是第一个info.table[0], 接下去的是子表，根据子表记录数，增加tableset中子表的trs
        let tr = this.tablesetp.trs[i]; //取 tablesetp 每一行记录
        this.$set(tr, 'rindex', 0); //rindex  记录数
        trs.push(tr);
        let spantds = []; //如果存在行合并的单元格
        if (this.tablesetp.trs[i].tds[0].com != null) {
          //如果td存在com，那么根据com 的tableIndex 判断是否是子表

          let tbindex;
          let haseSub = 0;
          let userSign = false;
          this.tablesetp.trs[i].tds.forEach((td, tdindex) => {
            if (td.com) {
              //								if(td.com.comattrs.tableIdx){
              //									haseSub = haseSub + td.com.comattrs.tableIdx;
              //									if(td.com.comattrs.tableIdx>0){
              //										tbindex = td.com.comattrs.tableIdx;
              //									}
              //								}
              if (td.com.comattrs.tableIdx && td.com.comstyles.addrow) {
                //索引>0  并且 表单设置了可以新增
                tbindex = td.com.comattrs.tableIdx;
                haseSub = 1;
              }
              if (td.com.comattrs.tableIdx) {
                if (this.info.table[td.com.comattrs.tableIdx].tableName == 'T_USER_MSIGN') {
                  tbindex = td.com.comattrs.tableIdx;
                  userSign = true; //用户签名特别处理
                }
              }
            }
          });

          if (haseSub > 0 || userSign) {
            //如果是子表
            //							spantds = this.getRowSpanTd(i);
            //判断子表是否存在一条记录
            if (this.info.table.length == 1) {
              //只有主表记录
              let trecord = deepCopy(this.tableRecord);
              this.info.table.push(trecord);
              if (tbindex == tableIndex) {
                //tableset增加数量  addrow 行数
                for (let j = 0; j < num; j++) {
                  let copytr = deepCopy(tr);
                  this.$set(copytr, 'rindex', j + 1);
                  trs.push(copytr);
                  let trecords = deepCopy(this.tableRecord);
                  this.info.table.push(trecords);
                }
                spantds.forEach((item, index) => {
                  item.rowspan = item.rowspan + num;
                });
              }
            } else {
              //如果配置了this.info.table[tbindex].record = [] 空的情况，给this.info.table[tbindex].record设置个空对象

              let nums = this.info.table[tbindex].record.length;
              let rindex = 0;
              if (nums == 0) {
                //如果子表记录是空的，那么给 info.table[tbindex].record push一个空对象
                let obj = {};
                this.info.table[tbindex].record.push(obj);
                if (num > 1) {
                  //插入余下的num
                  for (let j = 1; j < num; j++) {
                    let copytr = deepCopy(tr);
                    rindex = rindex + 1;
                    this.$set(copytr, 'rindex', rindex);
                    trs.push(copytr);
                    this.info.table[tbindex].record.push({});
                  }
                  spantds.forEach((item, index) => {
                    item.rowspan = item.rowspan + num - 1;
                  });
                }
              } else {
                if (nums > 1) {
                  //如果子表记录大于1 记录存在多条   本身tableset 有一行子表 trs  ，有多条记录就需要copy trs	，让每一条记录都有一行
                  for (let j = 1; j < nums; j++) {
                    let copytr = deepCopy(tr);
                    rindex = rindex + 1;
                    this.$set(copytr, 'rindex', rindex);
                    trs.push(copytr); //增加 表单行数  如果是新增一行  那么this.info.table[tbindex].record.push({}) 要插入一条空记录
                  }
                }
                //因为 需要增加行  就单独  循环一次 要增加的tr ，为了保证 html 绑定不出错，就必须增加对应的 info.table中的record记录
                let ttr = deepCopy(tr);
                ttr.tds.forEach((item) => {
                  //把 下拉框的设置信息和 键值对信息清空  ，要不然每条子表记录的下拉信息，键值对信息显示一样了
                  if (item.com) {
                    this.$set(item.com.comattrs, 'option', []);
                    this.$set(item.com.comattrs, 'param', null);
                  }
                });
                for (let j = 0; j < num; j++) {
                  let copytr = deepCopy(ttr);
                  rindex = rindex + 1;
                  this.$set(copytr, 'rindex', rindex);
                  trs.push(copytr);
                  this.info.table[tbindex].record.push({});
                }
                spantds.forEach((item, index) => {
                  item.rowspan = item.rowspan + rindex;
                });
              }
            }
          }
        }
      }
      this.$set(this.tableset, 'trs', trs);
      this.$set(this.tableset, 'initJs', this.tablesetp.initJs); //设置运行脚本
      this.$set(this.tableset, 'afterSaveJs', this.tablesetp.afterSaveJs); //设置保存后脚本  beforeSend
      this.$set(this.tableset, 'beforeSendJs', this.tablesetp.beforeSendJs);
      this.settablesize();
      //				this.setcomsize();
      this.settOption();
      //				//console.log(this.tableset);
    },
    setTextarea() {
      this.$nextTick(() => {
        if (this.$refs.area) {
          for (let i = 0; i < this.$refs.area.length; i++) {
            let item = this.$refs.area[i];
            //console.log(item.$el)
            let h = item.$el.parentNode.style.height;
            //console.log(h)
            //							item.$el.children[0].style.cssText = 'minHeight:'+ h +"px";
            //							item.$el.children[0].style.minHeight = h + 'px';
            this.$set(item.$el.children[0].style, 'height', '100%');
            this.$set(item.$el.children[0].style, 'background', 'red');
            //							item.$el.children[0].style.setProperty('minHeight', h +"px");
            //							item.$el.children[0].style.setProperty('maxHeight', h +"px");
            //console.log(item.$el.children[0].style);
          }
        }
      });
    },
    // 进行表单中的加行操作
    addRow() {
      if (this.activetr != -1) {
        let $tr = this.tableset.trs[this.activetr];
        let tbindex = 0;
        let haseSub = 0;
        this.tableset.trs[this.activetr].tds.forEach((td, tdindex) => {
          //console.log(td.com.comattrs.tableIdx && td.com.comstyles.addrow,this.canAddRow(this.activetr))
          if (td.com) {
            //							if(td.com.comattrs.tableIdx){
            //								haseSub = haseSub + td.com.comattrs.tableIdx;
            //								if(td.com.comattrs.tableIdx>0){
            //									tbindex = td.com.comattrs.tableIdx;
            //								}
            //							}
            if (td.com.comattrs.tableIdx && td.com.comstyles.addrow) {
              //索引>0  并且 表单设置了可以新增
              tbindex = td.com.comattrs.tableIdx;
              if (this.canAddRow(this.activetr)) {
                haseSub = 1;
              }
            }
          } else {
            haseSub = 1;
          }
        });

        //console.log(this.info.table[tbindex].tableName,haseSub)
        if (this.info.table[tbindex].tableName != 'T_USER_MSIGN') {
          //签名表  不能让用户增加
          if (haseSub > 0) {
            //如果是子表	 当前行数 真好是选中行
            this.info.table[tbindex].record.splice([$tr.rindex + 1], 0, {}); //增加记录

            this.setTableSetNouserEvent();
            this.settablesize();
            //console.log(this.info.table[tbindex].record,this.info.table[tbindex].tableName,haseSub)
          } else {
            this.message('当前表不可以增加行！', 3);
          }
        } else {
          this.message('签名表不可以增加行！', 3);
        }
      }
    },
    delRowBytable(tableIndex, rindex) {
      if (this.tableIndex > 0) {
        let $rindex = -1; //用来记录找到子表的第几个子表数
        for (let i = 0; i < this.tableset.trs.length; i++) {
          //遍历每行 查找是否包含子表的索引
          let tr = this.tableset.trs[i];
          let candel = false; //tr是否可以删除
          this.tableset.trs[i].tds.forEach((td, tdindex) => {
            //遍历td  并查找td中com定义的table索引是不是和要删除的子表索引一样
            if (td.com) {
              //								if(td.com.comattrs.tableIdx){
              //									if(td.com.comattrs.tableIdx == tableIndex){//如果找到的 tableIdx  和 要删除  tableIndex一样则记录 当前tr
              //										trindex = i;
              //									}
              //								}
              if (td.com.comattrs.tableIdx && td.com.comstyles.addrow) {
                //索引>0  并且 表单设置了可以新增
                if (td.com.comattrs.tableIdx == tableIndex) {
                  //如果找到的 tableIdx  和 要删除  tableIndex一样则记录 当前tr
                  candel = true; //说明当前行可以删除
                }
              }
            }
          });

          if (candel && tr.rindex == rindex) {
            //如果记录的子表数  正是   要删除的  第几行子表  ，那么就删除
            let len = this.tableset.trs.length; //从当前行开始 把所有的子表行数 进行上移
            let hasNext = false; //是否存在下一条子记录
            for (let j = i + 1; j < len; j++) {
              //把子表剩下的行数都上移		j < len
              if (this.tableset.trs[j].rindex > 0) {
                //当行数 变为0 说明碰到其它表了，那么就要跳出循环
                hasNext = true;
                this.tableset.trs[j].rindex = this.tableset.trs[j].rindex - 1;
              } else {
                break;
              }
            }

            let hasPrevious = false; //是否存在上一条子记录
            if (tr.rindex > 0) {
              //rindex == 0  说明是第一条子记录
              hasPrevious = true;
            }
            if (hasPrevious || hasNext) {
              this.info.table[tableIndex].record.splice([rindex], 1); //删除记录
              this.tableset.trs.splice(i, 1); //删除tableset的tr
            } else {
              this.info.table[tbindex].record[tr.rindex] = {};
            }
          }
        }
      }
      this.settablesize();
      //				this.setcomsize();
    },
    // 进行表单中的删行操作
    delRow() {
      if (this.activetr != -1) {
        let $tr = this.tableset.trs[this.activetr];
        // console.log(this.activetr,this.activetd)
        let tbindex = 0;
        let haseSub = 0;
        $tr.tds.forEach((td, tdindex) => {
          //把table索引加起来，因为主表table索引是0，加起来是0，所以大于0就是子表

          if (td.com) {
            //							if(td.com.comattrs.tableIdx){
            //								haseSub = haseSub + td.com.comattrs.tableIdx;
            //								if(td.com.comattrs.tableIdx>0){
            //									tbindex = td.com.comattrs.tableIdx;
            //								}
            //							}
            if (td.com.comattrs.tableIdx && td.com.comstyles.addrow) {
              //索引>0  并且 表单设置了可以新增
              tbindex = td.com.comattrs.tableIdx;
              haseSub = 1;
            }
          }
        });

        if (this.info.table[tbindex].tableName != 'T_USER_MSIGN') {
          //签名表  不能让用户增加
          if (haseSub > 0) {
            //如果是子表	 当前行数 真好是选中行	下次要做 只剩一行清空数据  tableset 不删除
            if (this.info.table[tbindex].record.length > 1) {
              this.info.table[tbindex].record.splice([$tr.rindex], 1);
            } else {
              this.info.table[tbindex].record = [];
              this.info.table[tbindex].record.push({});
            }
            this.setTableSetNouserEvent();

            //							let len = this.tableset.trs.length;
            //							let hasNext = false; //是否存在下一条子记录
            //
            //							for (let j = this.activetr + 1; j < 1000; j++) { //把子表剩下的行数都上移		j < len
            //								if (this.tableset.trs[j].rindex > 0) { //进入循环说明有下一条子记录
            //									hasNext = true;
            //									this.tableset.trs[j].rindex = this.tableset.trs[j].rindex - 1;
            //								} else {
            //									break;
            //								}
            //							}
            //							let hasPrevious = false; //是否存在上一条子记录
            //							if ($tr.rindex > 0) { //rindex == 0  说明是第一条子记录
            //								hasPrevious = true;
            //							}
            //							if (hasPrevious || hasNext) {
            //								this.info.table[tbindex].record.splice([$tr.rindex], 1); //删除记录
            //								this.tableset.trs.splice(this.activetr, 1); //删除tableset的tr
            //							} else {
            //								this.info.table[tbindex].record = [];
            //								this.info.table[tbindex].record.push({});
            //							}
          } else {
            this.message('不能删除该记录！', 3);
          }
        }
      }
      this.activetr = -1;

      //				this.setcomsize();
    },
    // ？应该是点击的当前单元格，传递的坐标信息，还有一些别的信息？
    cellclick(i, j, tr, td) {
      console.log('单击运行');
      this.activetr = i;
      this.activetd = j;
      this.runEvent('cellclick', i, j, tr, td);
      //console.log(i, j, tr, td);
    },
    selectvisible(v, i, j, tr, td) {
      console.log('td数据', td);
      if (v) {
        if (!td.com.comattrs.fixed) {
          let thisTableIdex = '';
          console.log(td.com.comattrs, td.com.comattrs.tableIdx, td.com.comattrs.showDetail, this.info.table);
          let sql = td.com.comattrs.showDetail;
          while (true) {
            let l_idx = sql.indexOf('[');
            let r_idx = sql.indexOf(']');
            if (l_idx == -1 || r_idx == -1 || l_idx > r_idx) break;
            let filedKey = sql.substring(l_idx + 1, r_idx);
            let f_idx = filedKey.indexOf(':');
            if (f_idx != 1) break;
            let tableIdex = filedKey.substr(0, 1);
            let recordIndex = 0;
            if (tableIdex == td.com.comattrs.tableIdx) recordIndex = tr.rindex;
            filedKey = filedKey.substring(2);
            console.log(this.info.table[tableIdex].record[recordIndex], filedKey, this.info.table[tableIdex].record[recordIndex][filedKey]);
            let fieldVal = this.info.table[tableIdex].record[recordIndex][filedKey];
            sql = sql.substring(0, l_idx) + fieldVal + sql.substring(r_idx + 1);
          }
          //
          if (td.com.comattrs.sql == sql) return;
          this.$set(td.com.comattrs, 'sql', sql);
          // td.com.comattrs.sql = sql;

          //
          let tparam = {
            sql: sql,
            microId: this.info.microId
            // repId: this.info.repId,
            // fieldName:
            //     td.com.comattrs.tableIdx +
            //     ":" +
            //     td.com.comattrs.fieldName,
          };
          wpselect(tparam).then((res) => {
            if (res.success && res.info) {
              let toption = res.info
                .map((obj) => {
                  return obj.NAME;
                })
                .join(',');
              this.$set(td.com.comattrs, 'option', res.info);
              console.log('选中负责人带回表单', toption, res);
              if (res.info.length > 1) {// 不存在多行
                // 多人
                if (this.info.table[td.com.comattrs.tableIdx].record && this.info.table[td.com.comattrs.tableIdx].record[tr.rindex][`${td.com.comattrs.fieldName}_NAME`]) {
                  this.info.table[td.com.comattrs.tableIdx].record[tr.rindex][`${td.com.comattrs.fieldName}_NAME`] = toption
                  // console.log('多人设置成功');
                } else {
                  // 单人变多人
                  this.$set(this.info.table[td.com.comattrs.tableIdx].record[tr.rindex], `${td.com.comattrs.fieldName}_NAME`, toption)
                }
                // console.log(toption);
              } else {
                // 单人
                if (this.info.table[td.com.comattrs.tableIdx].record && this.info.table[td.com.comattrs.tableIdx].record[tr.rindex][`${td.com.comattrs.fieldName}_NAME`]) {
                  this.$delete(this.info.table[td.com.comattrs.tableIdx].record[tr.rindex], `${td.com.comattrs.fieldName}_NAME`)
                }
                if (
                  this.info.table[td.com.comattrs.tableIdx].fields[j].showType != 2 &&
                  this.info.table[td.com.comattrs.tableIdx].fields.find((b) => b.fieldName == td.com.comattrs.fieldName.toUpperCase()).showDetail
                ) {
                  this.$set(this.info.table[td.com.comattrs.tableIdx].select[td.com.comattrs.fieldName.toUpperCase()], 'option', res.info);
                  console.log('set成功');
                }
              }
              // let filterName = []

              // this.$set(this.info.table[tableIdex].record)
            }
          });
        }
      }
      this.activetr = i;
      this.activetd = j;
    },
    validateField(trindex, tdindex, td, rindex) {
      //判断字段类型 及 值范围	 校验  验证
      let val = this.info.table[td.com.comattrs.tableIdx].record[rindex][td.com.comattrs.fieldName];
      if (val) {
        //如果有值 就要判断  输入类型 和 值范围
        let res = {
          result: true,
        };
        if (td.com.comattrs.fieldType == 1) {
          //整形 浮点型 要判断 输入类型
          res = validateInt(val);
        } else if (td.com.comattrs.fieldType == 2) {
          res = validateFloat(val);
        }
        if (res.result) {
          //如果输入类型ok，那么 需要判断 值的范围
          this.$set(td.com.comattrs, 'msg', '');
          this.$set(td.com.comattrs, 'right', true);
          //判断范围
          if (td.com.comattrs.fieldType == 0) {
            let len = strLen(val.toString());
            if (td.com.comattrs.minVal) {
              if (len < td.com.comattrs.minVal) {
                this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '字符长度不能小于' + td.com.comattrs.minVal);
                this.$set(td.com.comattrs, 'right', false);
              }
            }
            if (td.com.comattrs.maxVal) {
              if (len > td.com.comattrs.maxVal) {
                this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '字符长度不能大于' + td.com.comattrs.maxVal);
                this.$set(td.com.comattrs, 'right', false);
              }
            }
          }

          if (td.com.comattrs.fieldType == 1 || td.com.comattrs.fieldType == 2) {
            //整形 浮点型
            if (td.com.comattrs.minVal) {
              if (val < parseFloat(td.com.comattrs.minVal)) {
                this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '值不能小于' + td.com.comattrs.minVal);
                this.$set(td.com.comattrs, 'right', false);
              }
            }
            if (td.com.comattrs.maxVal) {
              if (val > parseFloat(td.com.comattrs.maxVal)) {
                this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '值不能大于' + td.com.comattrs.maxVal);
                this.$set(td.com.comattrs, 'right', false);
              }
            }
          }

          if (td.com.comattrs.fieldType == 3) {
            //时间
            if (td.com.comattrs.minVal) {
              if (dateFormat(val, 'y-m-d h:i:s') < dateFormat(td.com.comattrs.minVal, 'y-m-d h:i:s')) {
                this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '时间不能小于' + td.com.comattrs.minVal);
                this.$set(td.com.comattrs, 'right', false);
              }
            }
            if (td.com.comattrs.maxVal) {
              if (dateFormat(val, 'y-m-d h:i:s') > dateFormat(td.com.comattrs.maxVal, 'y-m-d h:i:s')) {
                this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '时间不能大于' + td.com.comattrs.maxVal);
                this.$set(td.com.comattrs, 'right', false);
              }
            }
          }
        } else {
          //输入类型不符合就 设置错误信息
          console.log(res.message);
          this.$set(td.com.comattrs, 'msg', res.message);
          this.$set(td.com.comattrs, 'right', false);
        }
      } else {
        //val  没有值  那么就要判断 是否是必填
        if (td.com.comattrs.notNull) {
          console.log(val, td.com.comattrs.fieldName);
          this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '字段不能为空！');
          this.$set(td.com.comattrs, 'right', false);
        }
      }
    },
    sql(tr, td, showDetail) {
      //sql内容解析

      let regex = /(?<=\[)(\d+:){1,2}\w+(?=\])/g; //用正则表达式 把 sql中的 参数取出来
      let params = showDetail.match(regex);
      let tableIndex = null;
      let field = null;
      if (params == null) {
        //如果正则表达  取出来的结果是  空  就赋值  []
        params = [];
      }
      let canSend = true;
      let obj = {};
      params.forEach((item, index) => {
        //参数取出后，组装参数
        let itemArr = item.split(':');
        //下拉框  切割 后  组装值
        tableIndex = itemArr[0];
        let rindex = null; //获取行索引
        if (tableIndex == 0) {
          rindex = 0;
        } else {
          rindex = tr.rindex;
        }
        field = itemArr[itemArr.length - 1]; //切割字段
        //组装参数
        if (this.getPkey(tableIndex) != field) {
          //如果是主键 可以允许为空  ，主要是验证字段值唯一的话， 要排除当前的记录，新增的时候当前记录主键为null
          if (this.info.table[tableIndex].record[rindex][field] == null) {
            canSend = false;
          }
          this.$set(obj, tableIndex + ':' + field, this.info.table[tableIndex].record[rindex][field]);
        } else {
          if (this.info.table[tableIndex].record[rindex][field] == undefined || this.info.table[tableIndex].record[rindex][field] == null) {
            this.$set(obj, tableIndex + ':' + field, 0);
          } else {
            this.$set(obj, tableIndex + ':' + field, this.info.table[tableIndex].record[rindex][field]);
          }
        }
      });
      let tparam = {
        wpId: this.info.wpId,
        fieldName: td.com.comattrs.tableIdx + ':' + td.com.comattrs.fieldName,
      };
      this.$set(tparam, 'param', obj);
      return {
        canSend: canSend,
        param: tparam,
      };
    },
    async uniqRule(i, j, all = true) {
      //正则验证  校验	范围 必填  格式  主键唯一
      let tr = this.tableset.trs[i]; //获取tr  td
      let td = tr.tds[j]; //tr.tds[tdindex]
      let ni; //下一个单元的 trindex
      let nj; //下一个单元格的tdindex
      if (j < tr.tds.length - 1) {
        //计算下一个单元格的 tr  td  的索引
        ni = i;
        nj = j + 1;
      } else {
        if (i < this.tableset.trs.length - 1) {
          ni = i + 1;
          nj = 0;
          if (ni == this.tableset.trs.length - 1) {
            return Promise.resolve(true); //没有表格了，返回true
          }
        }
      }
      if (td.com) {
        if (td.com.comattrs.tableIdx != null && td.com.comattrs.fieldType != null && td.com.comattrs.fieldName != null) {
          //配了table

          if (td.com.comattrs.enable && !td.com.comattrs.virtual) {
            //字段单元格可用，才需要校验， 要不然会校验那些还不可以编辑的字段，无法保存了
            this.$set(td.com.comattrs, 'right', true); //首先初始化为true
            let val = this.info.table[td.com.comattrs.tableIdx].record[tr.rindex][td.com.comattrs.fieldName.toUpperCase()]; //字段内容

            if (td.com.comattrs.notNull) {
              //必填验证
              if (val == null || val == '' || val == undefined) {
                console.log(val, td.com.comattrs.fieldName);
                this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '字段不能为空！');
                this.$set(td.com.comattrs, 'right', false);
                return Promise.resolve(false);
              }
            }

            if (val != null && val != '' && val != undefined) {
              //内容不为空的时候 进行规则验证
              //字段类型验证
              let rs = null;
              if (td.com.comattrs.fieldType == 1) {
                //整形 浮点型 要判断 输入类型
                rs = validateInt(val);
              } else if (td.com.comattrs.fieldType == 2) {
                rs = validateFloat(val);
              }
              if (rs) {
                if (!rs.result) {
                  console.log(td.com.comattrs.name + rs.message);
                  this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + rs.message);
                  this.$set(td.com.comattrs, 'right', false);
                  return Promise.resolve(false);
                }
              }

              //字段内容范围验证
              if (td.com.comattrs.fieldType == 0 && (td.com.comattrs.showType != 9 || td.com.comattrs.showType != 10)) {
                //字符串长度验证
                let len = strLen(val.toString());
                if (td.com.comattrs.minVal) {
                  if (len < td.com.comattrs.minVal) {
                    this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '字符长度不能小于' + td.com.comattrs.minVal);
                    this.$set(td.com.comattrs, 'right', false);
                    return Promise.resolve(false);
                  }
                }
                if (td.com.comattrs.maxVal) {
                  if (len > td.com.comattrs.maxVal) {
                    this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '字符长度不能大于' + td.com.comattrs.maxVal);
                    this.$set(td.com.comattrs, 'right', false);
                    return Promise.resolve(false);
                  }
                }
              }

              if (td.com.comattrs.fieldType == 1 || td.com.comattrs.fieldType == 2) {
                //整形 浮点型
                if (td.com.comattrs.minVal) {
                  if (val < parseFloat(td.com.comattrs.minVal)) {
                    this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '值不能小于' + td.com.comattrs.minVal);
                    this.$set(td.com.comattrs, 'right', false);
                    return Promise.resolve(false);
                  }
                }
                if (td.com.comattrs.maxVal) {
                  if (val > parseFloat(td.com.comattrs.maxVal)) {
                    this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '值不能大于' + td.com.comattrs.maxVal);
                    this.$set(td.com.comattrs, 'right', false);
                    return Promise.resolve(false);
                  }
                }
              }

              if (td.com.comattrs.fieldType == 3) {
                //时间
                if (td.com.comattrs.minVal) {
                  if (dateFormat(val, 'y-m-d h:i:s') < dateFormat(td.com.comattrs.minVal, 'y-m-d h:i:s')) {
                    this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '时间不能小于' + td.com.comattrs.minVal);
                    this.$set(td.com.comattrs, 'right', false);
                    return Promise.resolve(false);
                  }
                }
                if (td.com.comattrs.maxVal) {
                  if (dateFormat(val, 'y-m-d h:i:s') > dateFormat(td.com.comattrs.maxVal, 'y-m-d h:i:s')) {
                    this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '时间不能大于' + td.com.comattrs.maxVal);
                    this.$set(td.com.comattrs, 'right', false);
                    return Promise.resolve(false);
                  }
                }
              }

              if (td.com.comattrs.uniqRule) {
                //规则验证

                if (td.com.comattrs.uniqRule.indexOf('sql:') != -1 || td.com.comattrs.uniqRule.indexOf('SQL:') != -1) {
                  //后台校验
                  let rp = this.sql(tr, td, td.com.comattrs.uniqRule);
                  if (rp.canSend) {
                    await wpgetValue(rp.param).then((res) => {
                      if (res.info > 0) {
                        this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '不能重复！');
                        this.$set(td.com.comattrs, 'right', false);
                        return Promise.resolve(false);
                      }
                    });
                  }
                }

                if (td.com.comattrs.uniqRule.indexOf('api:') != -1 || td.com.comattrs.uniqRule.indexOf('API:') != -1) {
                  //后台校验
                }

                if (td.com.comattrs.uniqRule.indexOf('reg:') != -1 || td.com.comattrs.uniqRule.indexOf('REG:') != -1) {
                  //后台校验

                  //console.log(reg);
                  let regex = eval(`/${reg}/g`);
                  if (!regex.test(val)) {
                    this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '格式不对！');
                    this.$set(td.com.comattrs, 'right', false);
                    return Promise.resolve(false);
                  }
                }
                //验证大小
                if (td.com.comattrs.uniqRule.indexOf('check:') != -1 || td.com.comattrs.uniqRule.indexOf('CHECK:') != -1) {
                  //后台校验
                  var check = td.com.comattrs.uniqRule.substring(6);
                  //console.log(check);
                  let rss = this.fieldReplace(check, trindex, tdindex);
                  if (!rss.res) {
                    this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '必须满足，' + rss.msg);
                    this.$set(td.com.comattrs, 'right', false);
                    return Promise.resolve(false);
                  }
                }
              }
            } //有内容的验证
          } //当前节点可用需要验证 字段合法
        } //当前的字段配置了表 字段 类型 才需要验证
      } //配置com的td才要验证

      if (!all) {
        //校验当前的
        return Promise.resolve(true);
      } else {
        //校验全部
        this.uniqRule(ni, nj).then((res) => {
          //继续调用下一个
          return Promise.resolve(res);
        });
      }
    },
    validateRecord(i) {
      let pkey = this.getUniqKey(i);
      if (pkey) {
        //设置了多行 需要验证的唯一键
        let arr = pkey.split('--');
        pkey = arr[0];
        let j = arr[1];
        let tr = this.tableset.trs[i];
        let td = tr.tds[j];

        let trindex = i - this.tableset.trs[i].rindex;
        for (let k = trindex; k < i; k++) {
          let r = this.tableset.trs[k].rindex;
          if (this.info.table[td.com.comattrs.tableIdx].record[r][pkey] == this.info.table[td.com.comattrs.tableIdx].record[tr.rindex][pkey]) {
            td.com.comattrs.enable = false;
            td.com.comattrs.msg = td.com.comattrs.name + '不能重复！';
            return false;
          }
        }
      }
      return true;
    },
    getUniqKey(i) {
      //可以多行的，并且有设置 唯一键的 才需要验证子表 这个键值是否唯一
      var tr = this.tableset.trs[i];
      var add = false;
      var pkey = null;
      var pkeyJ = -1;
      for (var j = 0; j < tr.tds.length; j++) {
        var td = tr.tds[j];
        if (td.com) {
          if (td.com.comstyles.addrow) {
            add = true;
            break;
          }
        }
      }
      for (var j = 0; j < tr.tds.length; j++) {
        //取第一个唯一键  ，以后的暂时不处理
        var td = tr.tds[j];
        if (td.com) {
          if (td.com.comattrs.uniqRule) {
            if (td.com.comattrs.uniqRule.indexOf('pkey:') > -1 || td.com.comattrs.uniqRule.indexOf('PKEY:') > -1) {
              pkey = td.com.comattrs.uniqRule.substring(5);
              pkeyJ = j;
              break;
            }
          }
        }
      }
      //console.log(pkey + '--' + pkeyJ);

      if (add && pkey) {
        //只有允许多行，并设置了  唯一键
        return pkey + '--' + pkeyJ;
      } else {
        return null;
      }
    },
    async validateOneField(i, j) {
      //验证单个字段 校验一个字段
      let tr = this.tableset.trs[i];
      let td = tr.tds[j];
      if (td.com) {
        if (td.com.comattrs.tableIdx != null && td.com.comattrs.fieldType != null && td.com.comattrs.fieldName != null) {
          //配了table
          if (td.com.comattrs.enable) {
            //字段单元格可用，才需要校验，&& !td.com.comattrs.virtual 要不然会校验那些还不可以编辑的字段，无法保存了
            this.$set(td.com.comattrs, 'right', true); //首先初始化为true
            let val = this.info.table[td.com.comattrs.tableIdx].record[tr.rindex][td.com.comattrs.fieldName.toUpperCase()]; //字段内容

            if (td.com.comattrs.notNull) {
              //必填验证
              if (val == null || val === '' || val == undefined) {
                console.log(val, td.com.comattrs.fieldName);
                this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '字段不能为空！');
                this.$set(td.com.comattrs, 'right', false);
                return Promise.resolve(false);
              }
            }

            if (val != null && val != '' && val != undefined) {
              //内容不为空的时候 进行规则验证
              //字段类型验证
              let rs = null;
              if (td.com.comattrs.fieldType == 1) {
                //整形 浮点型 要判断 输入类型
                rs = validateInt(val);
              } else if (td.com.comattrs.fieldType == 2) {
                rs = validateFloat(val);
              }
              if (rs) {
                if (!rs.result) {
                  this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + rs.message);
                  this.$set(td.com.comattrs, 'right', false);
                  return Promise.resolve(false);
                }
              }

              //字段内容范围验证
              if (td.com.comattrs.fieldType == 0 && (td.com.comattrs.showType != 9 || td.com.comattrs.showType != 10)) {
                //字符串长度验证
                let len = strLen(val.toString());
                if (td.com.comattrs.minVal) {
                  if (len < td.com.comattrs.minVal) {
                    this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '字符长度不能小于' + td.com.comattrs.minVal);
                    this.canSave = false;
                    this.$set(td.com.comattrs, 'right', false);
                    return Promise.resolve(false);
                  } else {
                    this.canSave = true;
                  }
                }
                if (td.com.comattrs.maxVal) {
                  if (len > td.com.comattrs.maxVal) {
                    this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '字符长度不能大于' + td.com.comattrs.maxVal);
                    this.canSave = false;
                    this.$set(td.com.comattrs, 'right', false);
                    return Promise.resolve(false);
                  } else {
                    this.canSave = true;
                  }
                }
              }

              if (td.com.comattrs.fieldType == 1 || td.com.comattrs.fieldType == 2) {
                //整形 浮点型
                if (td.com.comattrs.minVal) {
                  if (val < parseFloat(td.com.comattrs.minVal)) {
                    this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '值不能小于' + td.com.comattrs.minVal);
                    this.$set(td.com.comattrs, 'right', false);
                    return false;
                  }
                }
                if (td.com.comattrs.maxVal) {
                  if (val > parseFloat(td.com.comattrs.maxVal)) {
                    this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '值不能大于' + td.com.comattrs.maxVal);
                    this.$set(td.com.comattrs, 'right', false);
                    return Promise.resolve(false);
                  }
                }
              }

              if (td.com.comattrs.fieldType == 3) {
                //时间
                if (td.com.comattrs.minVal) {
                  if (dateFormat(val, 'y-m-d h:i:s') < dateFormat(td.com.comattrs.minVal, 'y-m-d h:i:s')) {
                    this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '时间不能小于' + td.com.comattrs.minVal);
                    this.$set(td.com.comattrs, 'right', false);
                    return Promise.resolve(false);
                  }
                }
                if (td.com.comattrs.maxVal) {
                  if (dateFormat(val, 'y-m-d h:i:s') > dateFormat(td.com.comattrs.maxVal, 'y-m-d h:i:s')) {
                    this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '时间不能大于' + td.com.comattrs.maxVal);
                    this.$set(td.com.comattrs, 'right', false);
                    return Promise.resolve(false);
                  }
                }
              }

              if (td.com.comattrs.uniqRule) {
                //规则验证

                if (td.com.comattrs.uniqRule.indexOf('sql:') != -1 || td.com.comattrs.uniqRule.indexOf('SQL:') != -1) {
                  //后台校验
                  let rp = this.sql(tr, td, td.com.comattrs.uniqRule);
                  if (rp.canSend) {
                    let res = await wpgetValue(rp.param);
                    if (res.info > 0) {
                      this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '不能重复！');
                      this.$set(td.com.comattrs, 'right', false);
                      return Promise.resolve(false);
                    }
                  }
                }

                if (td.com.comattrs.uniqRule.indexOf('msg:') != -1 || td.com.comattrs.uniqRule.indexOf('MSG:') != -1) {
                  //后台校验
                  let rp = this.fieldReplaceNull(td.com.comattrs.uniqRule.substring(4), i, j);
                  if (rp) {
                    this.userEvents.sql(rp).then((res) => {
                      if (res.info && res.info.length > 0) {
                        var msg;
                        for (let key in res.info[0]) {
                          msg = res.info[0][key];
                        }
                        this.$set(td.com.comattrs, 'msg', msg);
                        this.$set(td.com.comattrs, 'right', false);
                        return Promise.resolve(false);
                      }
                    });
                  }
                }

                if (td.com.comattrs.uniqRule.indexOf('api:') != -1 || td.com.comattrs.uniqRule.indexOf('API:') != -1) {
                  //后台校验
                }

                if (td.com.comattrs.uniqRule.indexOf('reg:') != -1 || td.com.comattrs.uniqRule.indexOf('REG:') != -1) {
                  //后台校验
                  let reg = td.com.comattrs.uniqRule.substring(4);
                  //console.log(reg);
                  let regex = eval(`/${reg}/g`);
                  if (!regex.test(val)) {
                    this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '格式不对！');
                    this.$set(td.com.comattrs, 'right', false);
                    return Promise.resolve(false);
                  }
                }
                //验证大小
                if (td.com.comattrs.uniqRule.indexOf('check:') != -1 || td.com.comattrs.uniqRule.indexOf('CHECK:') != -1) {
                  //后台校验
                  var check = td.com.comattrs.uniqRule.substring(6);
                  let rss = this.fieldReplace(check, i, j);
                  if (!rss.res) {
                    this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '必须满足，' + rss.msg);
                    this.$set(td.com.comattrs, 'right', false);
                    return Promise.resolve(false);
                  }
                }
              }
            } //有内容的验证
          } //当前节点可用需要验证 字段合法
        } //当前的字段配置了表 字段 类型 才需要验证
      } //配置com的td才要验证
      return Promise.resolve(true);
    },
    fieldReplaceNull(dblParamIn, i, j) {
      //字段替换  存在null  就返回null
      let tr = this.tableset.trs[i];
      let td = tr.tds[j];
      if (dblParamIn.indexOf('[deptId]') > -1) {
        dblParamIn = dblParamIn.replace('[deptId]', this.deptId);
      }
      if (dblParamIn.indexOf('[userId]') > -1) {
        dblParamIn = dblParamIn.replace('[userId]', this.$store.state.user.info);
      }
      let regex = /(?<=\[)(\d+:){1,2}\w+(?=\])/g; //用正则表达式 把 sql中的 参数取出来
      let params = dblParamIn.match(regex);
      let tableIdex = null;
      let tfield = null;
      if (params == null) {
        //如果正则表达  取出来的结果是  空  就赋值  []
        params = [];
      }
      let obj = {};
      let exitNull = false;
      params.forEach((item, index) => {
        //参数取出后，组装参数
        let itemArr = item.split(':');
        //下拉框  切割 后  组装值
        tableIdex = parseInt(itemArr[0]);
        let rind = null; //获取行索引
        if (tableIdex == 0) {
          rind = 0;
        } else {
          rind = tr.rindex;
        }
        tfield = itemArr[itemArr.length - 1]; //切割字段
        //console.log(this.info.table[tableIdex].record);

        var vall = this.info.table[tableIdex].record[rind][tfield];
        if (this.info.table[tableIdex].record[rind][tfield] == undefined || this.info.table[tableIdex].record[rind][tfield] == null || this.info.table[tableIdex].record[rind][tfield] == '') {
          exitNull = true;
        }
        let rval = this.info.table[tableIdex].record[rind][tfield] == undefined ? null : this.info.table[tableIdex].record[rind][tfield]; //undefined 会转成null 字符串转对象要用undefined  ，设置值 要用null
        dblParamIn = dblParamIn.replace('[' + item + ']', rval);
      });
      if (exitNull) {
        return null;
      } else {
        return dblParamIn;
      }
    },
    async validateAllField() {
      this.notNullNum = false
      //验证  校验所有字段
      for (var trindex = 0; trindex < this.tableset.trs.length; trindex++) {
        //遍历 tablese  根据 com配置 检测 this.info.table[td.com.comattrs.tableIdx].record[rindex][td.com.comattrs.fieldName]值是否规范
        var tr = this.tableset.trs[trindex];
        for (var tdindex = 0; tdindex < tr.tds.length; tdindex++) {
          var td = tr.tds[tdindex];
          if (td.com) {
            if (td.com.comattrs.tableIdx != null && td.com.comattrs.fieldType != null && td.com.comattrs.fieldName != null) {
              //配了table

              //								//console.log(trindex +"行；"+tdindex+"列；"+td.com.comattrs.fieldName);
              if (td.com.comattrs.enable) {
                //字段单元格可用， 不启用虚拟字段不校验&& !td.com.comattrs.virtual 才需要校验， 要不然会校验那些还不可以编辑的字段，无法保存了
                this.$set(td.com.comattrs, 'right', true); //首先初始化为true
                //加特殊处理 因为子表中存在主表字段

                let $rindex = tr.rindex;
                if (td.com.comattrs.tableIdx == 0) {
                  $rindex = 0;
                }
                var val = this.info.table[td.com.comattrs.tableIdx].record[$rindex][td.com.comattrs.fieldName.toUpperCase()]; //字段内容

                if (td.com.comattrs.notNull) {
                  //必填验证
                  // let num = 0
                  if (val == null || val === '' || val == undefined) {
                    console.log(val, td.com.comattrs.fieldName);
                    this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '字段不能为空！');
                    this.$set(td.com.comattrs, 'right', false);
                    // let num = 0
                    this.notNullNum = true

                    // return Promise.resolve(false);
                  }

                }

                if (val != null && val != '' && val != undefined) {
                  //内容不为空的时候 进行规则验证
                  //字段类型验证
                  var rs = null;
                  if (td.com.comattrs.fieldType == 1) {
                    //整形 浮点型 要判断 输入类型
                    rs = validateInt(val);
                  } else if (td.com.comattrs.fieldType == 2) {
                    rs = validateFloat(val);
                  }
                  if (rs) {
                    if (!rs.result) {
                      this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + rs.message);
                      this.$set(td.com.comattrs, 'right', false);
                      return Promise.resolve(false);
                    }
                  }

                  //字段内容范围验证
                  if (td.com.comattrs.fieldType == 0) {
                    //字符串长度验证
                    if (td.com.comattrs.showType != 9 && td.com.comattrs.showType != 10) {
                      var len = strLen(val.toString());
                      if (td.com.comattrs.minVal) {
                        if (len < td.com.comattrs.minVal) {
                          this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '字符长度不能小于' + td.com.comattrs.minVal);
                          this.$set(td.com.comattrs, 'right', false);
                          return Promise.resolve(false);
                        }
                      }
                      if (td.com.comattrs.maxVal) {
                        if (len > td.com.comattrs.maxVal) {
                          this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '字符长度不能大于' + td.com.comattrs.maxVal);
                          this.$set(td.com.comattrs, 'right', false);
                          return Promise.resolve(false);
                        }
                      }
                    }
                  }

                  if (td.com.comattrs.fieldType == 1 || td.com.comattrs.fieldType == 2) {
                    //整形 浮点型
                    if (td.com.comattrs.minVal) {
                      if (val < parseFloat(td.com.comattrs.minVal)) {
                        this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '值不能小于' + td.com.comattrs.minVal);
                        this.$set(td.com.comattrs, 'right', false);
                        return false;
                      }
                    }
                    if (td.com.comattrs.maxVal) {
                      if (val > parseFloat(td.com.comattrs.maxVal)) {
                        this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '值不能大于' + td.com.comattrs.maxVal);
                        this.$set(td.com.comattrs, 'right', false);
                        return Promise.resolve(false);
                      }
                    }
                  }

                  if (td.com.comattrs.fieldType == 3) {
                    //时间
                    if (td.com.comattrs.minVal) {
                      if (dateFormat(val, 'y-m-d h:i:s') < dateFormat(td.com.comattrs.minVal, 'y-m-d h:i:s')) {
                        this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '时间不能小于' + td.com.comattrs.minVal);
                        this.$set(td.com.comattrs, 'right', false);
                        return Promise.resolve(false);
                      }
                    }
                    if (td.com.comattrs.maxVal) {
                      if (dateFormat(val, 'y-m-d h:i:s') > dateFormat(td.com.comattrs.maxVal, 'y-m-d h:i:s')) {
                        this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '时间不能大于' + td.com.comattrs.maxVal);
                        this.$set(td.com.comattrs, 'right', false);
                        return Promise.resolve(false);
                      }
                    }
                  }

                  if (td.com.comattrs.uniqRule) {
                    //规则验证

                    if (td.com.comattrs.uniqRule.indexOf('msg:') != -1 || td.com.comattrs.uniqRule.indexOf('MSG:') != -1) {
                      //后台校验
                      let rp = this.fieldReplaceNull(td.com.comattrs.uniqRule.substring(4), trindex, tdindex);
                      if (rp) {
                        let res = await this.userEvents.sql(rp);
                        if (res.info && res.info.length > 0) {
                          var msg;
                          for (let key in res.info[0]) {
                            msg = res.info[0][key];
                          }
                          this.$set(td.com.comattrs, 'msg', msg);
                          this.$set(td.com.comattrs, 'right', false);
                          return Promise.resolve(false);
                        }
                      }
                    }

                    if (td.com.comattrs.uniqRule.indexOf('api:') != -1 || td.com.comattrs.uniqRule.indexOf('API:') != -1) {
                      //后台校验
                    }

                    if (td.com.comattrs.uniqRule.indexOf('reg:') != -1 || td.com.comattrs.uniqRule.indexOf('REG:') != -1) {
                      //后台校验
                      var reg = td.com.comattrs.uniqRule.substring(4);
                      //console.log(reg);
                      var regex = eval(`/${reg}/g`);
                      if (!regex.test(val)) {
                        this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '格式不对！');
                        this.$set(td.com.comattrs, 'right', false);
                        return Promise.resolve(false);
                      }
                    }
                    //											//验证大小
                    if (td.com.comattrs.uniqRule.indexOf('check:') != -1 || td.com.comattrs.uniqRule.indexOf('CHECK:') != -1) {
                      //后台校验
                      var check = td.com.comattrs.uniqRule.substring(6);
                      let rss = this.fieldReplace(check, trindex, tdindex);
                      if (!rss.res) {
                        this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '必须满足，' + rss.msg);
                        this.$set(td.com.comattrs, 'right', false);
                        return Promise.resolve(false);
                      }
                    }
                  }
                } //有内容的验证
                if (td.com.comattrs.uniqRule) {
                  //sql  可能配置了 null 的字段   ， 就是为了判断它是否为null
                  if (td.com.comattrs.uniqRule.indexOf('sql:') != -1 || td.com.comattrs.uniqRule.indexOf('SQL:') != -1) {
                    //后台校验
                    var rp = this.sql(tr, td, td.com.comattrs.uniqRule);
                    //												if (rp.canSend) {
                    var res = await wpgetValue(rp.param);
                    if (td.com.comattrs.uniqRule.indexOf('count') != -1) {
                      //count 大于0 说明 已经存在 则提示不能重复
                      if (res.info > 0) {
                        this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + '重复或空！');
                        this.$set(td.com.comattrs, 'right', false);
                        return Promise.resolve(false);
                      }
                    } else {
                      if (res.info) {
                        //查询有返回内容，说明符合sql的验证  则输出sql 的提示信息
                        this.$set(td.com.comattrs, 'msg', td.com.comattrs.name + res.info);
                        this.$set(td.com.comattrs, 'right', false);
                        return Promise.resolve(false);
                      }
                    }
                    //												}
                  }
                }
              } //当前节点可用需要验证 字段合法
            } //当前的字段配置了表 字段 类型 才需要验证
          } //配置com的td才要验证
          //						if(trindex > 0){//如果是子表  又配置了 唯一字段  则需要验证
          //							if(!validateRecord(trindex)){
          //								return Promise.resolve(false);
          //							}
          //						}
        }
      }
      if (this.notNullNum) {
        return Promise.resolve(false)
      }
      return Promise.resolve(true);
    },
    fieldReplace(check, i, j) {
      //字段替换
      let regex = /(?<=\[)(\d+:){1,2}\w+(?=\])/g; //用正则表达式 把 sql中的 参数取出来
      let params = check.match(regex);
      let tableIdex = null;
      let tfield = null;
      if (params == null) {
        //如果正则表达  取出来的结果是  空  就赋值  []
        params = [];
      }

      let func = check;
      let msg = check;
      params.forEach((item, index) => {
        //参数取出后，组装参数

        let itemArr = item.split(':');
        //下拉框  切割 后  组装值
        tableIdex = parseInt(itemArr[0]);
        tfield = itemArr[itemArr.length - 1]; //切割字段
        var fieldVal = this.strToFND(tableIdex, tfield, i, j);
        //console.log(fieldVal);

        func = func.replace('[' + item + ']', fieldVal);
        msg = msg.replace('[' + item + ']', this.checkmsg(tableIdex, tfield, i, j));
      });

      let fs = new Function('return ' + func);
      //console.log(func);
      let res = fs();
      return {
        res: res,
        msg: msg,
      };
    },
    strToFND(tableIdex, field, i, j, r = null, val = null) {
      //字符  转 整形 浮点型  时间
      let tr = this.tableset.trs[i]; //fieldType  1 整形  2 浮点型  3 时间  parseFloat  parseInt   new Date(d)
      let rind = null; //获取行索引
      if (tableIdex == 0) {
        rind = 0;
      } else {
        rind = tr.rindex;
        if (r != null) {
          //如果外面有r传入就用r的索引，因为有可能主表 配置了  sum函数  ，sum中的子表索引可以从 this.info.table[tableIdex].record中取，而不必遍历trs
          rind = r;
        }
      }
      //				//console.log(field);
      //				//console.log(rind);
      //				//console.log(tableIdex);
      //				//console.log(this.info.table[tableIdex].record[rind]);
      //				//console.log(this.info.table[tableIdex].record[rind][field]);

      for (let k = 0; k < this.info.table[tableIdex].fields.length; k++) {
        //遍历 this.info.table[tableIdex].fields 取字段类型，根据类型返回不同的值
        let tfield = this.info.table[tableIdex].fields[k];
        console.log(456, tfield);
        if (tfield.fieldName == field) {
          if (tfield.fieldType == null) {
            this.message(field + '字段必须配类型！', 3);
            return null;
          }
          if (tfield.fieldType == 0) {
            let res;
            if (this.info.table[tableIdex].record[rind][field]) {
              res = "'" + this.info.table[tableIdex].record[rind][field] + "'";
            } else {
              if (val == '') {
                res = "''";
              } else {
                res = val;
              }
            }
            return res;
          }

          if (tfield.fieldType == 1) {
            let resv;
            if (this.info.table[tableIdex].record[rind][field] === null || this.info.table[tableIdex].record[rind][field] === '' || this.info.table[tableIdex].record[rind][field] === undefined) {
              resv = val;
            } else {
              resv = this.info.table[tableIdex].record[rind][field];
            }
            return parseInt(resv);
          }

          if (tfield.fieldType == 2) {
            let resv;
            if (this.info.table[tableIdex].record[rind][field] === null || this.info.table[tableIdex].record[rind][field] === '' || this.info.table[tableIdex].record[rind][field] === undefined) {
              resv = val;
            } else {
              resv = this.info.table[tableIdex].record[rind][field];
            }

            return parseFloat(resv);
          }

          if (tfield.fieldType == 3) {
            let tdate;

            if (this.info.table[tableIdex].record[rind][field]) {
              tdate = new Date(this.info.table[tableIdex].record[rind][field]).getTime() / 1000;
            } else {
              if (val != null) {
                tdate = new Date(val).getTime() / 1000;
              } else {
                tdate = null;
              }
            }

            return tdate;
          }
        }
      }
    },
    checkmsg(tableIdex, field, i, j) {
      let tr = this.tableset.trs[i]; //fieldType  1 整形  2 浮点型  3 时间  parseFloat  parseInt   new Date(d)
      let rind = null; //获取行索引
      if (tableIdex == 0) {
        rind = 0;
      } else {
        rind = tr.rindex;
      }
      for (let k = 0; k < this.info.table[tableIdex].fields.length; k++) {
        //遍历 this.info.table[tableIdex].fields 取字段类型，根据类型返回不同的值
        let tfield = this.info.table[tableIdex].fields[k];
        if (tfield.fieldName == field) {
          return tfield.name;
        }
      }
    },
    calcAll() {
      //计算所有的公式
      for (let r = 0; r < this.tableset.trs.length; r++) {
        //遍历tr
        let $tr = this.tableset.trs[r];
        for (let d = 0; d < $tr.tds.length; d++) {
          //遍历td
          let $td = $tr.tds[d];
          if ($td.com && $td.com.comattrs.tableIdx != null && $td.com.comattrs.fieldName) {
            if (($td.com.comattrs.enable && $td.com.comattrs.formula) || ($td.com.comattrs.virtual && $td.com.comattrs.formula)) {
              //有公式
              let formula = $td.com.comattrs.formula;
              //解析公式

              let rz = this.formulaReplace(formula, r, d);
              if (rz === '') {
                rz = null;
              }
              if (typeof rz === 'number' && !isNaN(rz)) {
                if ($td.com.comattrs.fieldType == 3) {
                  //日期要转成 日期字符串保存
                  let rq = dateFormat(rz * 1000, 'y-m-d h:i:s');
                  let oldVal = this.info.table[$td.com.comattrs.tableIdx].record[$tr.rindex][$td.com.comattrs.fieldName];
                  this.info.table[$td.com.comattrs.tableIdx].record[$tr.rindex][$td.com.comattrs.fieldName] = rq;
                  if (oldVal != this.info.table[$td.com.comattrs.tableIdx].record[$tr.rindex][$td.com.comattrs.fieldName]) {
                    this.userEvents.runEvent('inputchange', r, d, $tr, $td);
                  }
                } else {
                  let oldVal = this.info.table[$td.com.comattrs.tableIdx].record[$tr.rindex][$td.com.comattrs.fieldName];
                  this.info.table[$td.com.comattrs.tableIdx].record[$tr.rindex][$td.com.comattrs.fieldName] = rz;
                  if (oldVal != this.info.table[$td.com.comattrs.tableIdx].record[$tr.rindex][$td.com.comattrs.fieldName]) {
                    this.userEvents.runEvent('inputchange', r, d, $tr, $td);
                  }
                }
              } else {
                if (typeof rz == 'string') {
                  let oldVal = this.info.table[$td.com.comattrs.tableIdx].record[$tr.rindex][$td.com.comattrs.fieldName];
                  this.info.table[$td.com.comattrs.tableIdx].record[$tr.rindex][$td.com.comattrs.fieldName] = rz;
                  if (oldVal != this.info.table[$td.com.comattrs.tableIdx].record[$tr.rindex][$td.com.comattrs.fieldName]) {
                    this.userEvents.runEvent('inputchange', r, d, $tr, $td);
                  }
                } else {
                  let oldVal = this.info.table[$td.com.comattrs.tableIdx].record[$tr.rindex][$td.com.comattrs.fieldName];
                  this.info.table[$td.com.comattrs.tableIdx].record[$tr.rindex][$td.com.comattrs.fieldName] = null;
                  if (oldVal != this.info.table[$td.com.comattrs.tableIdx].record[$tr.rindex][$td.com.comattrs.fieldName]) {
                    this.userEvents.runEvent('inputchange', r, d, $tr, $td);
                  }
                }
              }
            }
          }
        }
      }
    },
    // [sS][uU][mM]\(.*\)  (?<=[sS][uU][mM]\()(.*)(?=\))  正则
    calc(i, j) {
      //公式计算
      let tr = this.tableset.trs[i]; //fieldType  1 整形  2 浮点型  3 时间  parseFloat  parseInt   new Date(d)
      let td = tr.tds[j];
      let tindex = td.com.comattrs.tableIdx; //获取行索引
      let field = td.com.comattrs.fieldName;
      for (let r = 0; r < this.tableset.trs.length; r++) {
        //遍历tr
        let $tr = this.tableset.trs[r];
        for (let d = 0; d < $tr.tds.length; d++) {
          //遍历td
          let $td = $tr.tds[d];
          if ($td.com && $td.com.comattrs.tableIdx != null && $td.com.comattrs.fieldName) {
            if ($td.com.comattrs.enable && $td.com.comattrs.formula) {
              //有公式

              let formula = $td.com.comattrs.formula;
              var idx = formula.indexOf('[' + tindex + ':' + field + ']');
              if (idx > -1) {
                //存在当前的字段
                //解析公式
                let rz = this.formulaReplace(formula, r, d);
                if (rz === '') {
                  rz = null;
                }
                if (typeof rz === 'number' && !isNaN(rz)) {
                  if ($td.com.comattrs.fieldType == 3) {
                    //日期要转成 日期字符串保存
                    let rq = dateFormat(rz * 1000, 'y-m-d h:i:s');
                    let oldVal = this.info.table[$td.com.comattrs.tableIdx].record[$tr.rindex][$td.com.comattrs.fieldName];
                    this.info.table[$td.com.comattrs.tableIdx].record[$tr.rindex][$td.com.comattrs.fieldName] = rq;
                    if (oldVal != this.info.table[$td.com.comattrs.tableIdx].record[$tr.rindex][$td.com.comattrs.fieldName]) {
                      this.userEvents.runEvent('inputchange', r, d, $tr, $td);
                    }
                  } else {
                    //console.log(rz)
                    let oldVal = this.info.table[$td.com.comattrs.tableIdx].record[$tr.rindex][$td.com.comattrs.fieldName];
                    this.info.table[$td.com.comattrs.tableIdx].record[$tr.rindex][$td.com.comattrs.fieldName] = rz;
                    if (oldVal != this.info.table[$td.com.comattrs.tableIdx].record[$tr.rindex][$td.com.comattrs.fieldName]) {
                      this.userEvents.runEvent('inputchange', r, d, $tr, $td);
                    }
                  }
                } else {
                  if (typeof rz == 'string') {
                    let oldVal = this.info.table[$td.com.comattrs.tableIdx].record[$tr.rindex][$td.com.comattrs.fieldName];
                    this.info.table[$td.com.comattrs.tableIdx].record[$tr.rindex][$td.com.comattrs.fieldName] = rz;
                    if (oldVal != this.info.table[$td.com.comattrs.tableIdx].record[$tr.rindex][$td.com.comattrs.fieldName]) {
                      this.userEvents.runEvent('inputchange', r, d, $tr, $td);
                    }
                  } else {
                    let oldVal = this.info.table[$td.com.comattrs.tableIdx].record[$tr.rindex][$td.com.comattrs.fieldName];
                    this.info.table[$td.com.comattrs.tableIdx].record[$tr.rindex][$td.com.comattrs.fieldName] = null;
                    if (oldVal != this.info.table[$td.com.comattrs.tableIdx].record[$tr.rindex][$td.com.comattrs.fieldName]) {
                      this.userEvents.runEvent('inputchange', r, d, $tr, $td);
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    nvlReplace(formula) {
      let regex = /(?<=nvl\()(.*?)(?=\))/g;
      let params = formula.match(regex);
      if (params == null) {
        //如果正则表达  取出来的结果是  空  就赋值  []
        params = [];
      }

      params.forEach((item, index) => {
        //取出（）的内容
        formula = formula.replace('nvl(' + item + ')', 'nvl<' + item + '>');
      });
      return formula;
    },
    nvl(formula, i, j, r = null) {
      //nvl([0:xxx],1) 先找出 nvl()的字符串，r代表的记录的索引，默认是null，取tr.rindex
      let regex = /(?<=nvl<)(.*?)(?=>)/g;
      let params = formula.match(regex);
      if (params == null) {
        //如果正则表达  取出来的结果是  空  就赋值  []
        params = [];
      }

      params.forEach((item, index) => {
        //取出（）的内容
        let farr = item.split(','); //分割出字段 和val
        let afield = farr[0];
        let val = farr[1];

        let reg = /(?<=\[)(\d+:){1,2}\w+(?=\])/g; //取出 表索引  和 字段
        let param = afield.match(reg);
        let tableIdex = null;
        if (param == null) {
          //如果正则表达  取出来的结果是  空  就赋值  []
          param = [];
        }
        let tfield = null;
        param.forEach((par, index) => {
          //参数取出后，组装参数
          let itemArr = par.split(':');
          //下拉框  切割 后  组装值
          if (tableIdex == null || tableIdex == 0) {
            tableIdex = parseInt(itemArr[0]);
          }
          tfield = itemArr[1];
        });
        let rindx = 0;
        if (tableIdex > 0 && r != null) {
          //r 外面有传入那么取外面的值
          rindx = r;
        }
        let result = this.strToFND(tableIdex, tfield, i, j, r, val);
        formula = formula.replace('nvl<' + item + '>', result);
      });
      return formula;
    },
    sumReplace(formula, i, j) {
      //公式 处理  sum
      //先处理 自定义函数  再处理通用的

      let regex = /(?<=[sS][uU][mM]\()(.*?)(?=\))/g;
      let params = formula.match(regex);
      if (params == null) {
        //如果正则表达  取出来的结果是  空  就赋值  []
        params = [];
      }
      params.forEach((item, index) => {
        let reg = /(?<=\[)(\d+:){1,2}\w+(?=\])/g; //用正则表达式 把 sql中的 参数取出来
        let param = item.match(reg);
        let tableIdex = null;
        let tf = null;
        if (param == null) {
          //如果正则表达  取出来的结果是  空  就赋值  []
          param = [];
        }
        param.forEach((par, index) => {
          //取出 [0:xxx]  来确定 sum 哪张子表数据
          //参数取出后，组装参数
          let itemArr = par.split(':');
          //下拉框  切割 后  组装值
          if (tableIdex == null || tableIdex == 0) {
            tableIdex = parseInt(itemArr[0]);
          }
        });
        let result = item;
        if (tableIdex != null) {
          result = 0;
          for (let k = 0; k < this.info.table[tableIdex].record.length; k++) {
            //result = result + this.otherReplace(item, i, j, k);//表示的式第几条子表记录

            let nonvlstr = this.nvl(item, i, j, k);
            result = result + this.otherReplace(nonvlstr, i, j, k);
          }
        }
        formula = formula.replace('sum(' + item + ')', result);
      });
      return formula;
    },
    otherReplace(formula, i, j, r = null) {
      //公式    其它处理

      let regex = /(?<=\[)(\d+:){1,2}\w+(?=\])/g; //用正则表达式 把 sql中的 参数取出来
      let params = formula.match(regex);
      let tableIdex = null;
      let tfield = null;
      if (params == null) {
        //如果正则表达  取出来的结果是  空  就赋值  []
        params = [];
      }

      let func = formula;
      let hasnull = false;
      params.forEach((item, index) => {
        //参数取出后，组装参数

        let itemArr = item.split(':');
        //下拉框  切割 后  组装值
        tableIdex = parseInt(itemArr[0]);
        tfield = itemArr[itemArr.length - 1]; //切割字段
        var fieldVal = this.strToFND(tableIdex, tfield, i, j, r);
        if (fieldVal == null) {
          hasnull = true;
        }
        //console.log(fieldVal);
        func = func.replace('[' + item + ']', fieldVal);
      });
      //				func = func.replace(/null/g, "''");
      //console.log(func)
      if (hasnull) {
        //如果字段为空 就是null 不执行函数
        return null;
      }
      let fs = new Function('return ' + func);
      let res = fs();
      return res;
    },
    count(formula) {
      let regex = /count\(\d{1,}\)/g;
      let params = formula.match(regex);
      if (params == null) {
        //如果正则表达  取出来的结果是  空  就赋值  []
        params = [];
      }
      params.forEach((item, index) => {
        let str = item.substr(6);
        let tableIdx = str.substr(0, str.length - 1);
        let count = this.info.table[tableIdx].record.length;
        formula = formula.replace(item, count);
      });
      return formula;
    },
    formulaReplace(formula, i, j) {
      //i，j 说明公式在哪一行 ，哪一列
      //count 函数先执行

      formula = this.count(formula);
      formula = this.nvlReplace(formula); //nvl() 会让 sum 处理有问题 所以改成 nvl<>
      formula = this.sumReplace(formula, i, j); //去掉 sum 函数
      formula = this.nvl(formula, i, j); //去掉nvl hans
      return this.otherReplace(formula, i, j); //去掉[0:xxx]
    },
    inputblur(i, j, td, recordindex) {
      this.uniqRule(i, j).then((res) => {
        //console.log(res);
      });
      //				//console.log(this.info.table);
      this.validateField(i, j, td, recordindex); //输入框离开事件  校验字段规范 并想父级窗口 回传离开事件  table索引，记录索引，字段名，字段值
      this.$emit('blur', td.com.comattrs.tableIdx, recordindex, td.com.comattrs.fieldName, this.info.table[td.com.comattrs.tableIdx].record[recordindex][td.com.comattrs.fieldName]);
    },
    initOption() {
      //初始化下拉菜单 下拉框
      this.tableset.trs.forEach((tr, trindex) => {
        //遍历 tablese  根据 com配置 检测是否是下拉框，然后根据配置 设置下拉option
        tr.tds.forEach((td, tdindex) => {
          if (td.com) {
            if (td.com.comattrs.showDetail && td.com.comattrs.fieldName) {
              let fieldName = td.com.comattrs.fieldName.toUpperCase();
              let map = this.info.table[td.com.comattrs.tableIdx].select;
              if (map[fieldName]) {
                td.com.comattrs.fixed = map[fieldName].fixed;
                // console.log(map[fieldName].option)
                // if(this.cellAdd){
                //   this.$set(td.com.comattrs, 'option', null);
                // }else{

                // }
                this.$set(td.com.comattrs, 'option', map[fieldName].option);
              }
            }
            //初始化 默认值, zgy 后续子表需要处理，暂时注销
            // if (td.com.comattrs.default) {
            //   if (
            //       this.info.table[td.com.comattrs.tableIdx].record[tr.rindex][
            //           td.com.comattrs.fieldName
            //           ] == null
            //   ) {
            //     if (td.com.comattrs.default == "true") {
            //       //默认值是否 true  false  因为传过来的是字符串  所以要转换
            //       //										this.info.table[td.com.comattrs.tableIdx].record[tr.rindex][td.com.comattrs.fieldName] = true;
            //     } else if (td.com.comattrs.default == "false") {
            //       //										this.info.table[td.com.comattrs.tableIdx].record[tr.rindex][td.com.comattrs.fieldName] = false;
            //     } else {
            //       if (td.com.comattrs.showType == 2) {
            //         //下拉框  那么匹配的是数组索引
            //         //											this.info.table[td.com.comattrs.tableIdx].record[tr.rindex][td.com.comattrs.fieldName] = td.com.comattrs.option[parseInt(td.com.comattrs.default)].ID;
            //       } else {
            //         this.info.table[td.com.comattrs.tableIdx].record[tr.rindex][
            //             td.com.comattrs.fieldName
            //             ] = td.com.comattrs.default;
            //       }
            //     }
            //   }
            // }

            this.setUserSignEnable(td, tr.rindex);
          }
        });
      });
    },

    print() { },
    wpsave() {
      if (!this.canSave) {
        this.message('表单有误，无法保存!', 3);
        return false;
      }
      //表单保存	父组件可以调用
      return new Promise((resolve) => {
        //					this.$set(this.info.table[0].record[0],'wpId',this.wpId);
        //					//console.log(this.info.table);
        let params = {
          wpId: this.info.wpId,
          deptId: this.deptId,
          tables: this.info.table,
          nodeCode: this.nodeCode,
          workId: this.workId,
          funcId: this.funcId,
          repId: this.repId,
          wpInstNodeId: this.wpInstNodeId,
          instNodeId: this.pinstNodeId,
        };
        wpsave(params).then((res) => {
          if (res.success) {
            this.workId = res.info.workId;
            this.pworkId = res.info.workId;
            this.changeworkid(res.info.workId)
            if (this.jhId == null || this.jhId == 0 || this.jhId == '') {
              //首节点保存 要获取计划id   wpInstNodeId  wpInstNodeId
              this.jhId = res.info.wpInstNodeId;
              this.wpInstNodeId = res.info.wpInstNodeId;
            }
            // this.$set()
            this.info.table = res.info.table;
            // console.log(this.info.table, res.info.table)
            this.$set(this.info, 'table', JSON.parse(JSON.stringify(res.info.table)));
            this.$set(this.info, 'notice', res.info.notice);
            //新增JS脚本解析
            let sys = { rep: this }
            let func = new Function('sys', this.info.afterSaveJs)
            func(sys)

            // this.userEvents.afterSave(); //表单 保存后 执行 一些用户脚本
            // this.setTableSet();
            //							for(let i=1;i<this.info.table.length;i++){
            //								if(this.info.table[i].rowNum != null){
            //									for(let j=0;j<this.info.table[i].rowNum;j++){
            //										if(this.info.table[i].record[j] == null){
            //											this.info.table[i].record.push({});
            //										}
            //									}
            //								}
            //							}
          }
          resolve(res);
        });
      });
    },
    async save(check = false) {
      //表单保存   父窗口来调用保存信息，先校验字段规范	 父组件可以调用
      return new Promise((resolve) => {
        let tres = {
          success: false,
          msg: '请修改红色标记处',
        };
        console.log(check);
        if (check) {
          //						this.uniqRule(0,0).then((rres)=>{
          //							if(rres){
          //								this.wpsave().then((res)=>{resolve(res);});
          //							}else{
          //								resolve(tres);
          //							}
          //						});
          this.validateAllField().then((rres) => {
            // console.log(tres);
            console.log(rres);
            if (rres) {
              this.wpsave().then((res) => {
                resolve(res);
              });
            } else {
              console.log(tres);
              resolve(tres);
            }
          });
        } else {
          this.wpsave().then((res) => {
            resolve(res);
          });
        }
      });
    },
    setFeildOption(tableIndex, rindex, field, options) {
      //设置字段的下拉选项
      for (let i = 0; i < this.tableset.trs.length; i++) {
        let tr = this.tableset.trs[i];
        for (let j = 0; j < tr.tds.length; j++) {
          td = tr.tds[j];
          if (td.com) {
            if (td.com.comattrs.tableIdx) {
              if (td.com.comattrs.tableIdx == tableIndex && tr.rindex == rindex && td.com.comattrs.fieldName == field) {
                this.$set(td.com.comattrs, 'option', options);
                this.$set(
                  td.com.comattrs,
                  'param',
                  JSON.stringify({
                    field: field,
                  })
                ); //这里随便写点
              }
            }
          }
        }
      }
    },
    getData() {
      //获取表数据 父组件可以调用
      console.log(this.info);
      return this.info;
    },
    // getButton(){
    //   return this.button;
    // },
    getTableSet() {
      //获取表结构 父组件可以调用
      return this.tableset;
    },
    getTableName(table) {
      //获取表名	 父组件可以调用
      if (table != null && table < this.info.table.length) {
        return this.info.table[table].tableName; //tableName
      } else {
        return null;
      }
    },
    getPkey(table) {
      //获取主键  父组件可以调用
      if (table != null && table < this.info.table.length) {
        return this.info.table[table].pkey; //tableName
      } else {
        return null;
      }
    },
    getPkeyValue(table, rindex) {
      //获取主键值  主键value 父组件可以调用
      console.log(table, rindex, this.info.table.length);
      table = table >= 0 ? table : 0;
      rindex = rindex ? rindex : 0;
      if (table != null && table < this.info.table.length) {
        let k = this.info.table[table].pkey;
        if (rindex < this.info.table[table].record.length) {
          console.log(k, this.info.table);
          console.log(this.info.table[table].record[rindex][k]);
          return this.info.table[table].record[rindex][k];
        } else {
          return null;
        }
      } else {
        return null;
      }
    },
    // 双击运行,怎么单击也会运行？
    runEvent(type, i, j, tr, td) {
      // type为触发事件的类型
      console.log(td)
      console.log('点击运行', type, i, j, tr, td.com.comattrs.fieldName);
      this.userEvents.runEvent(type, i, j, tr, td);
    },
    setValue(v) {
      this.userEvents.setValue(v);
    },
    setRecord(v) {
      console.log(v);
      this.userEvents.setRecord(v, this.out, this.microId);
      return;
      // console.log('this.out', this.out)
      // console.log('this.show', this.show)
      // if (
      //   this.show == "templateWindow" ||
      //   this.show == "selectType" ||
      //   this.show == "selectFunds" ||
      //   this.show == "selectMenu" ||
      //   this.show == "projectDeptTree" ||
      //   this.show == "customTree"
      // ) {
      //   if (this.show == "selectFunds" || this.show == "selectMenu") {
      //     let checkedList = [];
      //     checkedList.push(v);
      //     this.userEvents.setRecord(checkedList);
      //   } else {
      //     this.userEvents.setRecord(v);
      //   }
      // } else {
      //   this.userEvents.setRecord(v, this.out);
      // }
    },
    setCellView(v) {
      console.log(v)
      this.userEvents.setCellView(v);
    },
    addComAttr(temp) {
      //增加td  和 com  属性   ，在表单保存的时候 把一些默认属性删除了
      console.log(temp);
      temp.trs.forEach((tr, trindex) => {
        tr.tds.forEach((td, tdindex) => {
          for (let key in this.inittd) {
            if (td[key] == null) {
              this.$set(td, key, this.inittd[key]);
            }
          }
          if (td.com) {
            // if(td.com.comattrs&&td.com.comattrs.fieldName) {
            //   td.com.comattrs.fieldName = td.com.comattrs.fieldName.toUpperCase()
            // }
            // console.log(td.com.comattrs);
            if (td.com.comattrs == null) {
              this.$set(td.com, 'comattrs', {});
            }
            for (let key in com.comattrs) {
              if (td.com.comattrs[key] == null) {
                this.$set(td.com.comattrs, key, com.comattrs[key]);
              }
            }
            if (td.com.comattrs) {
              if (td.com.comattrs.showType == 0 || td.com.comattrs.showType == 2) {
                this.$set(com.comstyles, 'text-align', 'left');
              } else {
                this.$set(com.comstyles, 'text-align', 'center');
              }
            }
            if (td.com.comevents == null) {
              this.$set(td.com, 'comevents', {});
            }
            for (let key in com.comevents) {
              if (td.com.comevents[key] == null) {
                this.$set(td.com.comevents, key, com.comattrs[key]);
              }
            }
            if (td.com.comstyles == null) {
              this.$set(td.com, 'comstyles', {});
            }
            for (let key in com.comstyles) {
              if (td.com.comstyles[key] == null) {
                this.$set(td.com.comstyles, key, com.comstyles[key]);
              }
            }
          }
        });
      });
      return temp;
    },
    doprint() {
      // 点击打印，如果第一行高度不够增加高度，再添加一个二维码的区域，并打印；点击打印或者取消恢复原样
      let oldHeight = null;
      let newHeight = 100
      let _this = this
      // this.tableset.trs[0].tds[0].com &&
      if (this.tableset.trs[0].tds[0].com.comstyles.height < 101) {
        oldHeight = this.tableset.trs[0].tds[0].com.comstyles.height;
        this.tableset.trs[0].tds[0].com.comstyles.height = newHeight
      }
      this.erweima = true
      // 二维码渲染，通过发送有效数据，后端请求回来后渲染上二维码再执行打印功能
      this.activetr = -1;
      this.activetd = -1;
      this.printing = true;
      setTimeout(() => {
        let id = this.cellprint;
        new Print({
          ids: id, // * 局部打印必传入id
          standard: '', // 文档类型，默认是html5，可选 html5，loose，strict
          extraHead: '', // 附加在head标签上的额外标签,使用逗号分隔
          extraCss: '', // 额外的css连接，多个逗号分开
          popTitle: '', // title的标题
          endCallback() {
            // 调用打印之后的回调事件
            if (oldHeight) {
              _this.tableset.trs[0].tds[0].com.comstyles.height = oldHeight
              _this.erweima = false
            }
          },
        });
        this.printing = false;
      }, 100);

      //				var newWindow=window.open("打印窗口","_blank");
      //				var docStr = this.$refs.print.innerHTML;;
      //				newWindow.document.write(docStr);
      //				newWindow.document.close();
      //				newWindow.print();
      //				newWindow.close();
      //				window.print()
    },

    beforeSend() {
      //发送执行的代码
      return this.userEvents.beforeSend();
    },

    getFvar(type) {
      //流程发送获取流程变量
      let obstr = '{}';
      this.fvar = [];
      if (type === 2 && this.info.wpVar) {
        // 业务模型变量
        obstr = this.userEvents.fieldReplace(this.info.wpVar);
      } else if (this.info.wfVar) {
        // 流程变量
        obstr = this.userEvents.fieldReplace(this.info.wfVar);
      }

      let obj = JSON.parse(obstr);

      for (let key in obj) {
        let ob = {
          name: key,
          value: obj[key],
        };
        this.fvar.push(ob);
      }
      return this.fvar;
    },
    //运行自定义按钮方法
    runclick(item) {
      //自定义按钮  判断  权限
      // if (item.wfNode != "999999") {
      //   //如果当前是编辑状态，那么判断  是否是某个流程节点可用，如果没有流程直接可用 如果配置了999直接可用
      //   if (this.pnodeId == 1) {
      //     //如果是编辑状态
      //     if (this.wfClassId != null) {
      //       //有流程
      //       if (item.wfNode.indexOf(this.nodeCode) == -1) {
      //         return;
      //       }
      //     }
      //   } else {
      //     //不可编辑  直接返回
      //     return;
      //   }
      // }
      // this.out = "";
      // if (item.sql) {
      //   //有sql 先执行sql
      //   let str = this.userEvents.fieldReplace(item.sql);
      //   //console.log(str);
      //   this.userEvents.sql(str).then((res) => {
      //     //info[0].XM_ID
      //     if (item.win) {
      //       //弹出窗口
      //       if (item.in) {
      //         let pin = JSON.stringify(item.in);
      //         let ain = this.userEvents.fieldReplace(pin);
      //         for (let k in res.info[0]) {
      //           if (ain.indexOf("[" + k + "]") > -1) {
      //             ain = ain.replace("[" + k + "]", res.info[0][k]);
      //           }
      //         }
      //         let p = JSON.parse(ain);
      //         this.pparam = p;
      //         this.show = item.win;
      //         this.out = item.out;
      //       } else {
      //         this.pparam = {};
      //         this.show = item.win;
      //         this.out = item.out;
      //       }
      //     }
      //   });
      // } else {
      //   if (item.win) {
      //     //弹出窗口
      //     if (item.in) {
      //       let pin = JSON.stringify(item.in);
      //       let ain = this.userEvents.fieldReplace(pin);
      //       let p = JSON.parse(ain);
      //       this.pparam = p;
      //       //console.log(JSON.stringify(this.pparam));
      //       this.show = item.win;
      //       this.out = item.out;
      //     } else {
      //       this.pparam = {};
      //       this.show = item.win;
      //       this.out = item.out;
      //     }
      //   }
      // }
      // console.log('按钮item', item);
      // if (item.executeType == 0) {
      // 	// 前端按钮
      // 	let a = item.params
      // 	let btnName = "flowsend()wpsave()flowback()flowout()addRow()delRow()doprint()dialogVisible()addReport()"
      // 	console.log(btnName.indexOf(a));
      // 	if(btnName.indexOf(a) != -1){
      // 	  this.$emit('runBtnClicek', a)
      // 	}else{
      // 	  this.$message.error('自定义按钮设置错误')
      // 	}
      // } else if (item.executeType == 1) {
      // 	// 后端请求
      // 	if (item.formType == 0) {
      // 		// 窗体类型  无  只解析系统变量
      // 	} else if (item.formType == 1) {
      // 		// 窗体类型  模块  解析系统变量和当前表单变量
      // 		console.log('模块');
      // 	} else {
      // 		console.log('弹框');
      // 		// 窗体类型  弹窗  解析弹窗变量
      // 		let td = {}; //模拟产生td，为执行后续弹窗
      // 		td.com = {};
      // 		td.com.comattrs = {};
      // 		td.com.comattrs.tableIdx = -1;
      // 		td.com.comattrs.fieldName = '';
      // 		td.com.comattrs.enable = true;
      // 		td.com.comevents = {};
      // 		let formObj = JSON.parse(item.formObj);
      // 		td.com.comevents.doubleEvent = formObj.doubleEvent;
      // 		td.com.comevents.dblvue = formObj.dblvue;
      // 		td.com.comevents.dblcomId = formObj.dblcomId;
      // 		td.com.comevents.dblParamIn = formObj.dblParamIn;
      // 		td.com.comevents.dblParamOut = formObj.dblParamOut;
      // 		//
      // 		this.out = JSON.parse(formObj.dblParamOut);
      // 		//弹窗体，
      // 		this.comParam = item.params; //请求参数，runEvent中一并翻译了
      // 		// this.userEvents.runEvent('dblclick', -1, -1, null, td);// runevent运行表单定义事件
      // 		this.userEvents.runEvent('dblclick', -1, -1, null, td);
      // 		//开始 后端请求
      // 		// let method = ''
      // 		// if (item.contentType === 1) {
      // 		//   method = 'get'
      // 		// } else {
      // 		//   method = 'post' 
      // 		// }
      // 		// if(this.comParam == null || this.comParam == undefined){
      // 		//   this.comParam = ''
      // 		// }
      // 		// userDefinedApi(this.comParam, item.url, method, 1).then((res) => {
      // 		//   console.log(res)
      // 		// });
      // 	}
      // }
      console.log('按钮item', item);
      let sys = { rep: this }
      let scp = item.params
      // let scp1 = `let a = {instNodeId:sys.rep.pinstNodeId,users:[1221,2121,2121]}
      // JSON.stringify(a)
      // console.log(sys.rep.requestApi(JSON.stringify(a),'/wf/saveUser','post',2))
      // `
      let scp1 = `let a = sys.rep.requestApi('/getRow/SELECT%20*%20FROM%20TRAIN_WORKER_ENTRY/2','get');a.then(data => {return console.log(data)})`
      let scp2 = `let a = sys.rep.setCellValue(3,7,123,'qweqweqwe');console.log(a)`
      let scp3 = `let a = sys.rep.getWorkField(0,'WORK_MANAGER_ID');console.log(a)`
      let scp4 = `console.log(sys.rep.info)`
      let func = new Function('sys', scp)
      func(sys)
      // console.log(this.searchFieldName('WORK_MANAGER_ID'));
    },
    getTableCount() {// 返回一共有几条table
      return this.info.table.length
    },
    getWorkRep() { // 返回整个表对象
      return this.info
    },
    getWorkTable(index) { // 返回第几条table内容
      return this.info.table[index]
    },
    getRecordCount(index) { // 返回table中有几条记录
      return this.info.table[index].record.length
    },
    getRecordContent(index1, index2) { // 返回第几个table中第几条记录
      return this.info.table[index1].record[index2]
    },
    getFieldText(table, record, field) { // 返回字段文本
      return this.info.table[table].record[record][field]
    },
    setFieldText(table, record, field, text) {// 设置字段文本
      this.info.table[table].record[record][field] = text
    },
    getFieldValue(table, field) { // 返回字段的值
      return this.info.table[table].select[field].option
    },
    setFieldValue(table, record, field, id, name) { // 设置字段的值
      this.info.table[table].record[record][field] = id
      this.info.table[table].select[field].option[0].ID = id
      this.info.table[table].select[field].option[0].NAME = name
    },
    getCellText(tr, td) {// 获取单元格的文本
      return this.info.table[this.tableset.trs[tr].tds[td].com.comattrs.tableIdx].record[this.tableset.trs[tr].rindex][this.tableset.trs[tr].tds[td].com.comattrs.fieldName]
    },
    getCellValue(tr, td) {// 获取单元格的值
      return this.info.table[this.tableset.trs[tr].tds[td].com.comattrs.tableIdx].select[this.tableset.trs[tr].tds[td].com.comattrs.fieldName].option[0]
    },
    setCellText(tr, td, text) { // 设置单元格的文本
      this.info.table[this.tableset.trs[tr].tds[td].com.comattrs.tableIdx].record[this.tableset.trs[tr].rindex][this.tableset.trs[tr].tds[td].com.comattrs.fieldName] = text
    },
    setCellValue(tr, td, id, name) {// 设置单元格的值
      this.info.table[this.tableset.trs[tr].tds[td].com.comattrs.tableIdx].record[this.tableset.trs[tr].rindex][this.tableset.trs[tr].tds[td].com.comattrs.fieldName] = id
      this.info.table[this.tableset.trs[tr].tds[td].com.comattrs.tableIdx].select[this.tableset.trs[tr].tds[td].com.comattrs.fieldName].option[0].ID = id
      this.info.table[this.tableset.trs[tr].tds[td].com.comattrs.tableIdx].select[this.tableset.trs[tr].tds[td].com.comattrs.fieldName].option[0].NAME = name
    },
    getCellAttribute(tr, td) {// 获取当前单元格属性
      return this.tableset.trs[tr].tds[td].com.comattrs
    },
    setCellAttribute(tr, td, name, value) {// 设置当前单元格属性
      this.tableset.trs[tr].tds[td].com.comattrs[name] = value
    },
    getCellEvent(tr, td) {// 获取当前单元格事件
      return this.tableset.trs[tr].tds[td].com.comevents
    },
    setCellEvent(tr, td, name, value) {// 设置单元格事件
      this.tableset.trs[tr].tds[td].com.comevents[name] = value
    },
    getCellStyle(tr, td) {// 获取当前单元格样式
      return this.tableset.trs[tr].tds[td].com.comstyles
    },
    setCellStyle(tr, td, name, value) {// 设置单元格样式
      this.tableset.trs[tr].tds[td].com.comstyles[name] = value
    },
    workSever() {
      this.$emit('sysBtnClick', 'wpsave')
    },
    workSend() {
      this.$emit('sysBtnClick', 'flowsend')
    },
    workFallback() {
      this.$emit('sysBtnClick', 'flowback')
    },
    workInvalid() {
      this.$emit('sysBtnClick', 'flowout')
    },
    workAddRow() {
      this.$emit('sysBtnClick', 'addRow')
    },
    workDelRow() {
      this.$emit('sysBtnClick', 'delRow')
    },
    workPrint() {
      this.$emit('sysBtnClick', 'doprint')
    },
    async addPeople(id) {
      if (this.pinstNodeId) {
        let params = {}
        params.instNodeId = this.pinstNodeId
        params.users = id
        JSON.stringify(params)
        const data = await wfSaveUser(params)
        if (data.code == 200) {
          this.$message.success('添加人员成功')
        } else {
          this.$message.error('添加人员失败')
        }
      } else {
        this.$message.error('请在消息中心页面中选择')
      }

    },
    getWorkField(tableIndex, fieldName) {// 返回定义的字段对象
      for (let i = 0; i < this.tableset.trs.length; i++) {
        for (let j = 0; j < this.tableset.trs[i].tds.length; j++) {
          if (this.tableset.trs[i].tds[j].com) {
            if (this.tableset.trs[i].tds[j].com.comattrs.fieldName) {
              if (this.tableset.trs[i].tds[j].com.comattrs.fieldName == fieldName && this.tableset.trs[i].tds[j].com.comattrs.tableIdx == tableIndex) {
                return this.tableset.trs[i].tds[j].com.comattrs
              }
            }
          }
        }
      }
    },
    async requestApi(url, method, param, type) {
      let res = await userDefinedApi(url, method, param, type)
      // console.log(res);
      return res
    },
    setfile(v, tbindex, rindex, field) {
      //把图片路径 绑定到 图片字段
      //console.log(v);
      this.info.table[tbindex].record[rindex][field] = v;
    },
    setTableSetNouserEvent() {
      // 重新渲染表单，不再初始化 用户事件
      this.tableset = {}; //清空tableset ，然后根据  记录 增加 行数
      let trs = [];
      let rows = this.tablesetp.trs.length; //tablesetp

      //console.log(this.tablesetp.trs.length,this.tableset)
      for (let i = 0; i < rows; i++) {
        //console.log(i) //遍历记录，主表是第一个info.table[0], 接下去的是子表，根据子表记录数，增加tableset中子表的trs
        let tr = this.tablesetp.trs[i]; //取 tablesetp 每一行记录
        this.$set(tr, 'rindex', 0); //rindex  记录数
        trs.push(tr);
        let spantds = []; //如果存在行合并的单元格
        if (this.tablesetp.trs[i].tds[0].com != null) {
          //如果td存在com，那么根据com 的tableIndex 判断是否是子表

          let tbindex;
          let haseSub = 0;
          let userSign = false;

          this.tablesetp.trs[i].tds.forEach((td, tdindex) => {
            //遍历 tableset 每列 顺便初始化一些下拉信息
            if (td.com) {
              //
              //								if(td.com.comattrs.tableIdx){//新增行  重新判断
              //									haseSub = haseSub + td.com.comattrs.tableIdx;
              //									if(td.com.comattrs.tableIdx>0){
              //										tbindex = td.com.comattrs.tableIdx;
              //									}
              //}

              if (td.com.comattrs.tableIdx && td.com.comstyles.addrow) {
                //索引>0  并且 表单设置了可以新增
                tbindex = td.com.comattrs.tableIdx;
                haseSub = 1;
                this.addrow = this.canAddRow(i);
                this.$emit('setAddbtn', this.addrow);
              }
              if (td.com.comattrs.tableIdx) {
                if (this.info.table[td.com.comattrs.tableIdx].tableName == 'T_USER_MSIGN') {
                  tbindex = td.com.comattrs.tableIdx;
                  userSign = true; //用户签名特别处理
                }
                //上面的代码可能没用了，目前保留着
                if (!td.com.comstyles.addrow && this.info.table[td.com.comattrs.tableIdx].tableName != 'T_USER_MSIGN') {
                  //当前表是子表，也不是签名表，但不可以增加多行 ，那么就按表单设定行数初始化  tr的rindex
                  if (this.info.table[td.com.comattrs.tableIdx].rowNum) {
                    let bftd = this.tablesetp.trs[i - 1].tds[tdindex];
                    if (bftd.com && bftd.com.comattrs.tableIdx == td.com.comattrs.tableIdx && bftd.com.comattrs.fieldName == td.com.comattrs.fieldName) {
                      //如果和上一行的td的表索引，字段都相同，那么当前行rindex 要加加
                      let $index = this.tablesetp.trs[i - 1].rindex + 1;
                      this.$set(tr, 'rindex', $index);
                      if (this.info.table[td.com.comattrs.tableIdx].record[$index] == null || this.info.table[td.com.comattrs.tableIdx].record[$index] == undefined) {
                        //如果当前没记录要加空对象要不然会报错
                        this.info.table[td.com.comattrs.tableIdx].record.push({});
                      }
                    }
                  } else {
                    // 按 记录来 设置 tr
                    if (this.info.table[td.com.comattrs.tableIdx].record.length > 1) {
                      tbindex = td.com.comattrs.tableIdx;
                      haseSub = 1;
                    }
                  }
                }
              }

              this.setfieldEnable(td, tr.rindex);
            }
          });

          if (haseSub > 0 || userSign) {
            //如果是子表

            //判断子表是否存在一条记录
            //							spantds = this.getRowSpanTd(i);
            if (this.info.table.length == 1) {
              //只有主表记录
              let trecord = deepCopy(this.tableRecord);
              this.info.table.push(trecord);
            } else {
              //console.log('addRow',this.info.table[tbindex].record.length)
              let nums = this.info.table[tbindex].record.length;
              if (nums == 0) {
                //如果配了子表，但是info没记录，这个时候渲染的子表取不到数组的字段，绑定的字段会报错，给他赋个空对象
                let obj = {};
                this.info.table[tbindex].record.push(obj);
              }
              if (nums == 1) {
                //如果记录是一条那么不用操作
              }
              if (nums > 1) {
                //如果子表记录大于1
                for (let j = 1; j < nums; j++) {
                  let copytr = deepCopy(tr);
                  this.$set(copytr, 'rindex', j);
                  //console.log(copytr)
                  trs.push(copytr); //增加 表单行数  如果是新增一行  那么this.info.table[tbindex].record.push({}) 要插入一条空记录
                }
                //console.log(trs)
                spantds.forEach((item, index) => {
                  item.rowspan = item.rowspan + nums - 1;
                });
              }
            }
          }
        }
      }
      //console.log(this.tableset)
      this.$set(this.tableset, 'trs', trs);
      this.$set(this.tableset, 'initJs', this.tablesetp.initJs); //设置运行脚本
      this.$set(this.tableset, 'afterSaveJs', this.tablesetp.afterSaveJs); //设置保存后脚本
      this.$set(this.tableset, 'beforeSendJs', this.tablesetp.beforeSendJs); //设置保存后脚本

      this.settablesize();
      //				this.setcomsize();
      this.initOption();
    },
    ceshi(scp1) {
      let sys = { rep: this }

      // let scp1 = 'alert("测试啊啊啊")'
      let func = new Function('sys', scp1)
      func(sys)
    },
    settable(v) {
      //根据发票内容，设置table记录
      for (let i = 0; i < v.length; i++) {
        this.info.table[i].record = v[i].record;
        if (i == 0) {
          let pkey = this.info.table[0].pkey;
          this.$set(this.info.table[0].record[0], pkey, this.workId);
        }
      }
      if (this.workId == null || this.workId == '') {
        //如果新增
        if (this.deptId == null) {
          //部门id 在业务模块或者 模块查询新增 没有传入 部门id
          this.deptId = this.$store.state.user.info.deptId; //首节点部门特殊特殊处理
        }
        this.$set(this.info.table[0].record[0], 'fill_dept_id', this.deptId); //新增的时候没有部门id，需要设置进去，很多弹窗要根据部门过滤
      }
      this.setTableSetNouserEvent(); //根据数据设置tableset
    },
    closeCell() {
      //console.log(this.info);
      //console.log(this.tableset);
      this.show = null;
    },
    setSign(v) {
      this.userEvents.setSign(v);
    },
    checkChange(e, i, j, tr, td) {
      //复选框 变更
      //console.log(e);//info.table[td.com.comattrs.tableIdx].record[tr.rindex][td.com.comattrs.fieldName]
      this.$set(this.info.table[td.com.comattrs.tableIdx].record[tr.rindex], td.com.comattrs.fieldName, e);
    },
    //校验字段
    setSelect(v, i, j, tr, td) {
      let res = {};
      let tbindex = null;
      if (td.com.comevents.resset) {
        let out = JSON.parse(td.com.comevents.resset);
        tbindex = out.tbindex;
        let record = out.record;
        for (let key in record) {
          this.$set(res, key, v[record[key]]);
        }
      }

      if (tbindex > 0) {
        //如果是子表要判断唯一键
        let pkey = this.getUniqKey(i);
        if (pkey) {
          //设置了多行 需要验证的唯一键
          let arr = pkey.split('--');
          pkey = arr[0];
          let j = arr[1];
          let $tr = this.tableset.trs[i];
          let $td = $tr.tds[j];
          let tbindex = $td.com.comattrs.tableIdx;
          let trindex = i - this.tableset.trs[i].rindex; //当前行  减去当前行的rindex 就可以推出  子表数据是从哪个 tr开始
          let endtr = trindex + this.info.table[tbindex].record.length;
          for (let k = trindex; k < endtr; k++) {
            if (k != i) {
              //当前行不用判断，因为当前行是要被替换掉的
              let r = this.tableset.trs[k].rindex;
              if (this.info.table[tbindex].record[r][pkey] == res[pkey]) {
                this.message(res[$td.com.comattrs.fieldName] + '已经存在！', 3);
                return false;
              }
            }
          }
        }
      }
      for (let key in res) {
        this.$set(this.info.table[tbindex].record[tr.rindex], key, res[key]);
      }
    },
    setNewInfo() {
      this.$store.commit('getAddInfo', this.info.table)
    },

    ceshi1(a) {
      alert(a)
    },
    ajax(data) {
      $ajax(data)
    }
    // getTableinfo(type , i, j){
    // 	if(type == 'input'){
    // 	  console.log(this.tableset.trs[i].tds[j]);
    // 	  console.log(this.info.table[this.tableset.trs[i].tds[j].com.comattrs.tableIdx].record[this.tableset.trs[i].rindex][this.tableset.trs[i].tds[j].com.comattrs.fieldName.toUpperCase()]);
    // 	}else if(type == 'fanyi'){

    // 	}
    // },
    // ceshi(){
    // 	this.getTableinfo('input',3,1)
    // }
  },
};
</script>

<style scoped>
.businessButtonEdit::before {
  content: '';
}

.hiddenText {
  text-overflow: ellipsis;
  white-space: nowrap;
  overflow: hidden;
}

.hiddenText1 {
  text-overflow: ellipsis;
  white-space: nowrap;
  overflow: hidden;
}

/*element 输入框样式*/
/* >>> */
::v-deep .el-input {
  height: 100%;
}

/* >>> */
::v-deep .el-input__inner {
  height: 100%;
  border: none;
  border-radius: 0px;
  color: var(--input-text-color);
  font-size: 14px;
  font-family: Microsoft YaHei;
  font-weight: 400;
  text-align: inherit;
  background-color: transparent;
}

/* >>> */
::v-deep .el-input.is-disabled input,
/* >>> */
::v-deep .el-input.is-disabled textarea {
  /*background-color: transparent;*/
  color: rgb(153, 153, 153);
}

/*选择框*/
/* >>> */
::v-deep .el-select {
  width: 100%;
}

/*日期框*/
.el-date-editor.el-input {
  width: 100%;
  color: var(--input-text-color);
}

/*开关字体*/
/* >>> */
::v-deep .el-switch__label {
  color: var(--input-text-color);
}

/* >>> */
::v-deep .el-switch__label.is-active {
  color: #409eff;
}

/*element 输入框的 focus hover样式*/
/* >>> */
::v-deep .el-input__inner:focus,
/* >>> */
::v-deep .el-textarea__inner:focus {
  background: var(--input-focus-back-color);
}

/* >>> */
::v-deep .el-textarea__inner {
  border: none;
  border-radius: 0px;
  height: 100%;
}

/* >>> */
::v-deep .el-input__inner:hover,
/* >>> */
::v-deep .el-textarea__inner:hover {
  background: var(--input-hover-back-color);
}

/* >>> */
::v-deep .el-textarea__inner {
  color: var(--input-text-color);
  font-size: 14px;
  font-family: Microsoft YaHei;
  font-weight: 400;
  height: 100%;
}

/* >>> */
::v-deep .el-textarea {
  height: 100%;
}

.celltable {
  position: relative;
  margin-left: 20px;
}

/*设计表 样式*/

.designtable {
  /* position: relative; */
  tablelayout: fixed;
  bordercollapse: collapse;
  wordbreak: breakAll;
  border-collapse: collapse;
}

.tdcell {
  border: 1px solid rgba(220, 226, 230, 1);
  /*box-shadow: 0px 1px 0px 0px rgba(220, 226, 230, 1), 1px 0px 0px 0px rgba(220, 226, 230, 1);*/
}

.active-cell {
  outline: 1px solid rgb(133, 187, 255);
}

.error-cell {
  /*outline: 1px solid #F56C6C;*/
}

/*错误信息  显示*/
.error-cell
/* >>> */
::v-deep .el-input__inner,
.error-cell
/* >>> */
::v-deep .el-textarea__inner,
.error-cell

/* >>> */
::v-deep .imgdiv {
  background: rgba(255, 51, 51, 0.1);
  color: rgba(255, 51, 51, 0.4);
}

/*下拉框 图标居中*/
/* >>> */
::v-deep .el-select .el-input .el-select__caret {
  line-height: inherit;
}

/* >>> */
::v-deep .el-input__icon {
  line-height: inherit;
}

/*时间框图标居中*/
.printtable ::v-deep .el-input__icon {
  line-height: inherit;
}

.printtable ::v-deep .el-input__prefix {
  display: none;
}

.printtable ::v-deep .el-input__suffix {
  display: none;
}

.printtable ::v-deep .el-input--prefix .el-input__inner {
  padding-left: 14px;
}

.printtable ::v-deep .el-input--suffix .el-input__inner {
  padding-right: 14px;
}

::v-deepel-input.is-disabled .el-input__inner {
  background-color: #FFFFFF !important;
}

.erweima {
  width: 80px;
  height: 80px;
  position: absolute;
  left: 70px;
  top: 8px;
}
</style>
